Make sure the exception has the right backtrace

When you raise it after catch you lose the context of where the timer
fired.  Create it in the signal handler like before but pass it up to
the catch block to re-raise at the correct level.