storage: support resumable uploads

## Do not merge yet - still writing tests

RE: #298

```js
/*! Developer Documentation
 *
 * `createWriteStream` uses the Resumable Upload API: http://goo.gl/jb0e9D.
 *
 * The process involves these steps:
 *
 *   1. POST the file's metadata. We get a resumable upload URI back, then cache
 *      it with ConfigStore.
 *   2. PUT data to that URI with a Content-Range header noting what position
 *      the data is beginning from. We also cache, at most, the first 16 bytes
 *      of the data being uploaded.
 *   3. Delete the ConfigStore cache after the upload completes.
 *
 * If the initial upload operation is interrupted, the next time the user
 * uploads the file, these steps occur:
 *
 *   1. Detect the presence of a cached URI in ConfigStore.
 *   2. Make an empty PUT request to that URI to get the last byte written to
 *      the remote file.
 *   3. PUT data to the URI starting from the first byte after the last byte
 *      returned from the call above.
 *
 * If the user tries to upload entirely different data to the remote file:
 *
 *   1. -- same as above --
 *   2. -- same as above --
 *   3. -- same as above --
 *   4. Compare the first chunk of the new data with the chunk in cache. If it's
 *      different, start a new resumable upload (Step 1 of the first example).
 */
```
Idk, first one sounds good. Jk, much better!

On Wednesday, November 12, 2014, Ryan Seys <notifications@github.com> wrote:

> In lib/storage/file.js:
>
> > @@ -264,30 +297,232 @@ File.prototype.createReadStream = function() {
> >   */
> >  File.prototype.createWriteStream = function(metadata) {
> >    var that = this;
> > +  var configStore = new ConfigStore('gcloud-node');
> > +  var makeAuthorizedRequest = that.bucket.storage.makeAuthorizedRequest_;
> > +  metadata = metadata || {};
> > +
> > +  var lastByteWritten;
>
>
> theNumberOfBytesWrittenByPreviousUploadAttemptFactoryFactoryEnterpriseEditionGooglePlayCloudStorageParameterNumber?
> [image: :smile:]
>
> How about numBytesWritten ?
>
> —
> Reply to this email directly or view it on GitHub
> <https://github.com/GoogleCloudPlatform/gcloud-node/pull/299/files#r20268325>
> .
>