S3 Managed Upload Support

This pull requests adds support for `AWS.S3.upload()`, which allows uploading of large or arbitrarily sized buffer/stream objects in parallel parts (when possible). This PR also adds the `AWS.S3.ManagedUpload` abstraction, which is the underlying object that manages the uploads.
This abstraction works by performing a multipart upload when there is more than 5MB of buffered data to upload.

Example usage:

```js
var fs = require('fs');
var zlib = require('zlib');

var body = fs.createReadStream('bigfile').pipe(zlib.createGzip());
var s3obj = new AWS.S3({params: {Bucket: 'myBucket', Key: 'myKey'}});
s3obj.upload({Body: body}).
  on('httpUploadProgress', function(evt) { console.log(evt); }).
  send(function(err, data) { console.log(err, data) });
```

Or via the ManagedUpload class directly:

```js
var fs = require('fs');
var zlib = require('zlib');

var params = {
  Bucket: 'myBucket',
  Key: 'myKey',
  Body: fs.createReadStream('bigfile').pipe(zlib.createGzip())
}

var upload = new AWS.S3.ManagedUpload({params: params});
upload.on('httpUploadProgress', function(evt) { console.log(evt); });
upload.send(function(err, data) { console.log(err, data) });
```

It is possible to configure concurrency with the `queueSize` configuration option:

```js
// uploads data 2 parts (of 10mb chunks) at a time
var options = {queueSize: 2, partSize: 1024 * 1024 * 10};
var upload = s3.upload(params, options, function(err, data) {
  console.log(err ? "FAILED!" : "DONE!");
});
```

By default this abstraction will cleanup a multipart upload if an error occurs on any part, though it is possible to set `leavePartsOnError` to true to avoid cleanup and handle this manually.