Adds DISABLED status for tasks in scheduler.

Tasks can get the disabled status either through scheduling or from repeated
failures. The scheduler handles disabling via repeated failures, and tasks
disabled this way are automatically re-enabled after a fixed amount of time
or when pruned. This allows tasks that are repeatedly running and blocking
progress on other tasks to be pushed aside until someone can have a look.

Tasks can be set as disabled via the disabled parameter in Task. Tasks with
this parameter set to true have will be scheduled as disabled and will not be
run. This disable can only be removed by setting disabled to false in the task
and re-scheduling it. This makes it easier to stop running broken tasks without
having to manually figure out all upstream dependents and remove those as well.
I think it's fine. It's just maintaining a data structure and updating it.

I don't think it's a big deal to use the system clock, but it could make sense to make it an argument instead (and if the value is `None` then pull the value from the system clock).

Also I generally prefer using unix timestamps for everything internally rather than datetimes, but maybe that's more a matter of preference.