Add socket.timeout to the list of retriable_exceptions

While trying to write a 170MB .csv file into GCS, I was continually seeing socket timeout problems. The errors occurred even after upping the `RetryParams` object as specifed in the Google documentation: https://developers.google.com/appengine/docs/python/googlecloudstorageclient/retryparams_class

I logged this problem in the Managed VMs google group: https://groups.google.com/forum/#!topic/app-engine-managed-vms/G3qNAJjIzko

The exception that occurred had a stack trace like this:

```
Traceback (most recent call last):
  File "/home/vmagent/app/third_party/mapreduce/lib/pipeline/pipeline.py", line 2041, in evaluate
    self, pipeline_key, root_pipeline_key, caller_output)
  File "/home/vmagent/app/third_party/mapreduce/lib/pipeline/pipeline.py", line 1055, in _run_internal
    return self.run(*self.args, **self.kwargs)
  File "/home/vmagent/app/prediction/pipelines_util.py", line 294, in run
    _sort_and_upload(all_rows, output_shard_idx)
  File "/home/vmagent/app/prediction/pipelines_util.py", line 280, in _sort_and_upload
    csv_writer.writerow(row)
  File "/home/vmagent/app/third_party/cloudstorage/storage_api.py", line 724, in write
    self._flush()
  File "/home/vmagent/app/third_party/cloudstorage/storage_api.py", line 804, in _flush
    self._send_data(data, self._written, file_len)
  File "/home/vmagent/app/third_party/cloudstorage/storage_api.py", line 830, in _send_data
    self._path_with_token, payload=data, headers=headers)
  File "/home/vmagent/app/third_party/cloudstorage/rest_api.py", line 54, in sync_wrapper
    return future.get_result()
  File "/home/vmagent/python_vm_runtime/google/appengine/ext/ndb/tasklets.py", line 325, in get_result
    self.check_success()
  File "/home/vmagent/python_vm_runtime/google/appengine/ext/ndb/tasklets.py", line 368, in _help_tasklet_along
    value = gen.throw(exc.__class__, exc, tb)
  File "/home/vmagent/app/third_party/cloudstorage/storage_api.py", line 128, in do_request_async
    deadline=deadline, callback=callback)
  File "/home/vmagent/python_vm_runtime/google/appengine/ext/ndb/tasklets.py", line 368, in _help_tasklet_along
    value = gen.throw(exc.__class__, exc, tb)
  File "/home/vmagent/app/third_party/cloudstorage/rest_api.py", line 187, in do_request_async
    follow_redirects=False)
  File "/home/vmagent/python_vm_runtime/google/appengine/ext/ndb/tasklets.py", line 368, in _help_tasklet_along
    value = gen.throw(exc.__class__, exc, tb)
  File "/home/vmagent/app/third_party/cloudstorage/api_utils.py", line 161, in run
    result = yield tasklet(**kwds)
  File "/home/vmagent/python_vm_runtime/google/appengine/ext/ndb/tasklets.py", line 368, in _help_tasklet_along
    value = gen.throw(exc.__class__, exc, tb)
  File "/home/vmagent/app/third_party/cloudstorage/rest_api.py", line 250, in urlfetch_async
    deadline=deadline, callback=callback)
  File "/home/vmagent/python_vm_runtime/google/appengine/ext/ndb/tasklets.py", line 371, in _help_tasklet_along
    value = gen.send(val)
  File "/home/vmagent/python_vm_runtime/google/appengine/ext/ndb/context.py", line 1275, in urlfetch
    validate_certificate=validate_certificate)
  File "/home/vmagent/python_vm_runtime/google/appengine/api/urlfetch.py", line 346, in make_fetch_call
    rpc.make_call('Fetch', request, response, _get_fetch_result, allow_truncated)
  File "/home/vmagent/python_vm_runtime/google/appengine/api/apiproxy_stub_map.py", line 529, in make_call
    self.__rpc.MakeCall(self.__service, method, request, response)
  File "/home/vmagent/python_vm_runtime/google/appengine/api/apiproxy_rpc.py", line 115, in MakeCall
    self._MakeCallImpl()
  File "/home/vmagent/python_vm_runtime/google/appengine/ext/vmruntime/vmstub.py", line 192, in _MakeCallImpl
    self.http_connection.request('POST', PROXY_PATH, body_data, headers)
  File "/usr/lib/python2.7/httplib.py", line 962, in request
    self._send_request(method, url, body, headers)
  File "/usr/lib/python2.7/httplib.py", line 996, in _send_request
    self.endheaders(body)
  File "/usr/lib/python2.7/httplib.py", line 958, in endheaders
    self._send_output(message_body)
  File "/usr/lib/python2.7/httplib.py", line 818, in _send_output
    self.send(msg)
  File "/usr/lib/python2.7/httplib.py", line 794, in send
    self.sock.sendall(data)
  File "/usr/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
timeout: timed out
```

With this change, the cloudstorage client library is able to apply it's retry logic even with the `socket.timeout` exception. I can see that happening in a recent run, and I also wrote a test case in the webapp repo to verify this.

```
def test_retry_on_socket_timeout(self):
    # Set the retry parameters to make the test fast
    TOTAL_CALLS = 5
    retry_params = gcs.RetryParams(initial_delay=0.1, backoff_factor=1.0,
        max_retries=(TOTAL_CALLS - 1))

    # Mock out a low-level to raise a timeout error occasionally
    with gcs.open("/bucket/test_file", 'w', retry_params=retry_params
            ) as gcs_file:
        with mock.patch.object(
                gcs_rest_api._RestApi, 'urlfetch_async') as urlfetch_mock:
            urlfetch_mock.side_effect = socket.timeout("fake timeout")

            # This will silently retry internally, and then finally
            # raise this exception
            self.assertRaises(gcs_errors.TimeoutError, gcs_file.write,
                "hello world" * gcs_file._flushsize)

            self.assertEqual(urlfetch_mock.call_count, TOTAL_CALLS)
```