Fix for cancelling setTimeout with cancel()

This fixes following problems:
- The cancel() function wasn't resetting the timer variable (this._laterTimer), blocking future setTimeout calls.
- The cancel() function wasn't clearing the actively running timeout; this caused an unnecessary run() call.
- The cancel() function wasn't calling updateLaterTimer to update the next timer

I added tests for all cases.