Semantically I'm not sure about your second suggestion as the actual behavior of the start_read() method would be to stop a timer on the connect timeout. I guess we could kill the finally() and move it right before we begin the read() on the socket, that makes more sense.

start/stop is not called around the socket read because once the timeout is set for the read it's sort of a useless value (I assumed) Is there a use for it?