I spent the evening thinking about it and, rather than try to invent some kind of abstract plug-in system, I'm going to forgo being generic and extend the clients with inheritance. I'm keeping the coroutine chains for decoding byte-oriented protocols like Telnet.