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.~~
InterruptedException is not the only means of clean thread shutdown: InterruptedException is merely the means of propagating the shutdown request upwards in the code by throwing it out. The "detection" of the shutdown request = the initial throwing of InterruptedException still needs to come from somewhere. You commonly don't notice that as you often will use low level system stuff such as socket IO which throws InterruptedException for you, but if you don't use that, there still has to be something to throw it if the thread was interrupted.
A typical example for where you need to introduce a way of throwing it is a worker such as:
```java
for(int i=0; i < 1000000; ++i) { do_math(); }
```
In those cases, you check the interrupted flag of the thread every N iterations where N is a sane amount of iterations.
Such as:
```java
for(int i=0; i < 1000000; ++i) {
do_math();
if(i % 1000 == 0 && Thread.currentThread().interrupted())
    throw new InterruptedException()
}
```

Thus, I would suggest to amend the JavaDoc like this:
> Hence, the job implementer must take care not to swallow {@link InterruptedException}<b>, and/or periodically check the {@link Thread#interrupted()} flag of its {@link Thread#currentThread}</b>