Handle client disconnect during live streaming

.. even when the producer is blocked for a write.

This is an alternative take on #15410.

It still needs tests, and would need to look moderately different to be backported: lose `ignore_disconnect`, and make `ClientDisconnected` subclass `IOError` (and kill the comment explaining why it doesn't :wink:).

Anyway, in my testing, it does seem to solve the problem, without repeatedly waking up the producer when it's blocked.

/cc @tenderlove @njakobsen