Refactor and improve test coverage.

API has changed to:

    AWS.S3.upload(params, [options], [callback])

If no callback is supplied, the operation returns an object that
can call `.send([callback])`.

Example:

    s3.upload({Body: body}, {queueSize: 10}, function(err, data) {
      console.log(err, data);
    });

    // or

    s3.upload({Body: body}, {queueSize: 10}).send(callback);

The `options` parameter can be omitted.
Extra test coverage for s3.upload() integration