Working queue

As per usual, comments are welcome :)

Fixes #380


* Then jobs won't show up in the `WorkingQueue` and those jobs will be "lost" if the process is interrupted during execution. I wrapped the registration process in a transaction with other job bootstrapping processes like `job.set_status` so the chance of this happening is small, only if the process is interrupted in the short window between dequeueing the job from queue and the registration process.

* If jobs aren't unregistered, eventually they will "expire" (score are lower than current time). "Expired" jobs will be moved to `FailedQueue` because they didn't finish executing. These expired jobs are those that are lost during execution, for example from hard shutdowns described by @bretth in #152.

* It's mainly for monitoring purposes and to prevent jobs from being lost during execution (#152).