Save data read in transport before raising exception

If the exception raised is due to a timeout, we might read from the transport
again. In the old code, the data was discarded, causing loss of
synchronization. This ensures the data we see is preserved for next time.

Also changes a related `raise exc` to `raise`.

The change is pretty small, but the added indentation level causes GitHub to show a large diff.