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.
Notice: InterruptedException does NOT happen randomly. If it happens, something *did* request shutdown. In this case that would probably be JUnit. So you should throw it out, not ignore it.
(People sometimes confuse InterruptedException with "spurious wakeup" because those are usually mentioned next to interruption in the Java JavaDoc, and thereby assume it can happen randomly. But spurious wakeup IMHO actually is the function *returning* even though it shouldn't, not throwing. InterruptedException does not happen randomly from my interpretation of the JavaDoc of Java threading: It precisely happens when something DID interrupt() the thread.  Read the JavaDoc again to make sure. In the case of Thread.sleep(), there probably isn't even spurious wakeups as its not a wait..() function)