more refactoring of RDY and backoff handling:

* skip redistributing RDY while blocked by backoff
* stop callbacks on closed connections
* re-schedule backoff on remaining connections
* properly send RDY on connect (after IDENTIFY)
* log message body on exception
* throttle connection attempts
* rename various internal methods for clarity
* separate a conn's rdy_timeout (for disabled handling) from the
  reader's global backoff_timeout (and clear backoff_timeout)
* force redistribute after a connection closes when in backoff
  or when it would have toggled out of normal redistribution cases
* test improvements
* dont 'optimize' when RDY is already the value we want (far far easier to reason in tests)
* when completely exiting backoff return to normal operation
* choose a random connection when backoff block expires