Improve error handling

* lib/resque/worker.rb (work): change job.fail(Dirty...) to
report_failed_job so exceptions that happen while reporting the
failure do not cause the worker to die
(done_working): for readonly failures, reconnect and retry
(working_on): ditto
(report_failed_job): ditto