Avoid unnecessary timeer rescheduling

This avoids clearing and re-scheduling a timer when the list of tasks
changes but the earliest task time didn't change. It makes a small,
but noticeable difference in profiling results under heavy scheduler
load (ie lots of scheduling). The setTimer/clearTimer methods no
longer even appear in the profiler results.