Background jobs

This changeset introduces an abstraction for (maintenance) jobs running in the background, of which execution may be triggered from other threads. SubscriptionManager could very well use this, but I haven't made it do so yet.

@xor-freenet Unit tests are not complete, I'll be finishing those tomorrow. I'm filing this pull request early so you can have a look at it already.
Both interpretations are wrong. It's in fact a callback function that notifies the job wrapper that the job has started to execute (and is therefore the last point to inhibit the start of the job). I'll rename to `onJobStarted()` and similar.