While on the surface this looks harmless (ignoring allocations),
`Scheduler` doesn't clear cancelled tasks until they reach their
execution time. This can cause an increase in time spent processing the
scheduler itself.
I don't think a per-frame updating component should use scheduled tasks
in this way in the first place, so I've just rewritten the logic to
avoid that overhead altogether.