Refactor Timeout start/stop behavior

Feedback from @wolever. Also, just catch SocketTimeouts, don't worry about
SocketErrors. Weirdly reading socket.py these don't seem to inherit from one
another but I tested in a REPL and it appears to work, so seems good.