Add support for an advanced task scheduler managed by the application.

I think we always need to have a way to ride the originally specified delay; though if it makes it cleaner, we could use a separate code path than the existing `run`.