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.
Hmm, lines like these worry me a bit. Can a task object be in an incosistent state or why does one have to check both `task.status == Disabled` and `task.disabled`. I haven't digged in at all into the code, but it feels unintuitive if those two are not equivalent (and then you only need one). I'm sure you have a reason to have seperate values for these, but maybe they can be named better?