Propagate error.Canceled instead of swallowing it (#125)
On an async std.Io a cancelled read/write surfaces as ReadFailed/WriteFailed
with the real error.Canceled hidden in the reader's .err, which we dropped.
Worse, a read error kicked off a readyForQuery drain that blocked until the
query finished, so a query deadline never worked.
Recover the real error in readStream/writeStream, and only drain after a PG
error (Conn.recoverFromError still re-raises a cancellation). drain() now
skips poisoned connections, and the teardown Terminate writes are shielded
from cancellation. Includes a test that cancels an in-flight pg_sleep and
checks it fails fast with error.Canceled.