Sets and executes timeouts set during a tick.

All timeouts and intervals set during a tick were scheduled to run at
delay + end-of-tick, instead of delay + time-of-outer-timeout.

Scheduled run-at times were shifted because currentTime was being
incremented before executing scheduled functions.

Additionally, the execute loop was iterating over a functions-to-run
array, created from scheduledFunctions before it started. Any changes
to scheduledFunctions would be ignored during the tick, and the next
tick would ignore any functions which should have been executed
in the past.

The commit is a rewrite of DelayedFunctionScheduler, preserving the
public interface. Execution of scheduled functions updates currentTime
on each iteration, and each time takes the functions with the lowest
runAtMillis from the schedule, if they aren't higher than endTime.