Throw ConnectionError when a connection times out

instead of read timeout, so we can handle connection failures independently

cc @tmm1