Support passing existing jobs to other queues

Jobs which have been taken from a queue for processing may need to
be entered into another queue (or the same one again) for further
processing.

This commit allows you to call `job.pass()` with a queue name and
callback to send the job along to another queue.

There's also some cleaning up of `this`/`self` to avoid future
pain.