Background jobs

Some TODO and probably bugs still in here, but I think this is an OK stopping point that should unblock activator to experiment with it.

this was customizable earlier in the commit chain when BackgroundJob was public and there was a non-thread version of this that just required providing a BackgroundJob. The privatizing of BackgroundJob was to reduce API that we might not want to support. The use of interrupt here is because our one concrete implementation right now uses sbt's built in runners which use interrupt based cancel.

We could add back the fully generic version of this that abstracts the cancel method by making start return a BackgroundJob. However we have to use interrupts when using sbt's existing runners.