This PR changes how jobs are moved to the same way as previous versions, i.e. uses the blocking BRPOPLPUSH command. However, in this case we use also a stalled set mechanism borrowed from BeeQueue. This mechanism does not replace the locking mechanism that we had in place, but solves a hazard due to not being able to move and lock atomically in redis. We keep the Locks because there are many subtle cases where they are necessary. Also locks help us know which worker is the one actually working on a job, which can be useful for creating UIs that show realtime job processing.