After a protocol error (e.g. a malformed line) the read loop ended but the client still reported IsConnected and later requests waited forever for a response that could never arrive. The read loop now marks the connection closed before failing pending requests, and RequestAsync throws IOException on a closed connection. Adds regression tests and a raw-line helper to the fake server.