Worker heartbeat-based cleanup

Commits need to be cleaned up, I'll do that later if this has interest upstream.

At Shopify, we run Resque workers in Docker containers across a lot of different servers. Each container, and therefore worker, thus has its own hostname. If a worker is shutdown abnormally, and doesn't get to unregister itself, there's no longer anything to clean up after it because the old logic works on a per host basis.

This takes a different approach, where each worker sends heartbeats at a specified interval. When new workers start, instead of looking for dead workers on the same host—it looks for workers which haven't sent a heartbeat for a while and unregisters them.

We've run this in production on 100s of workers restarting many times per day during deploys, and it's been working great.

Note that this is a PR to the 1-x-stable branch.