storage: use streams.

I know this is beating a dead horse, but I finally got streams working with the help of [duplexify](https://github.com/mafintosh/duplexify). Getting this in before M1 release would be fantastic, since this is such a fundamental Node philosophy, and is relied on in many apps.

Given that the streams worked out, I simplified the signature of `Bucket#write`. If a user wishes to use our writable, they are free to open their readable pipeline however they wish, then simply pipe it to `bucket.createWriteStream()` (as opposed to passing a readable to #write). As an added shortcut, `Bucket#write` accepts a string or buffer directly: `bucket.write('file', 'Hi!', function(err) {});`
In this case, I'm using bind to just set the arguments we know are fixed
for the callback. The first null represents the context the callback will
be executed in, and the second null represents the first argument in the
callback signature, the error object.

On Tuesday, August 19, 2014, Burcu Dogan <notifications@github.com> wrote:

> In lib/storage/index.js:
>
> >          .on('error', callback)
> > -        .on('complete', function(resp) {
> > -          util.handleResp(null, resp, resp.body, callback);
> > -        });
> > -  });
> > +        .on('complete', callback.bind(null, null));
>
> Why are we stripping out the response here? Especially if user is
> inserting a file, they would be interested in resp.body once upload is
> completed.
>
> —
> Reply to this email directly or view it on GitHub
> <https://github.com/GoogleCloudPlatform/gcloud-node/pull/118/files#r16438930>
> .
>