Allow custom param values to be read from files/urls

The `no_paramfile` setting can be used to disable this. By default, all custom
parameters will support `file://`, `http://` and `https://` URI schemes, with
the possibility of more coming in the future.
Update tests to not mock __builtin__.open
Do not auto parse JSON based on filename
Update paramfile custom argument to use events

Instead of introducing a new preprocessing method this uses existing events
and migrates code out of CLIArgument and into CLIDriver, which now fires and
handles that event instead of individual arguments. Due to this, all
arguments now support loading from a paramfile via URI.
Refactor load-cli-arg common event code

Custom commands, custom arguments, and existing service operations from the
service model now all use the same logic to unpack CLI arguments. This adds
support for file:// and http:// URIs to all arguments unless no_paramfile
has been set.
Fix doc example for s3api put-object

The low level s3api commands don't have any custom behavior,
so we will not automatically switch over to multipart uploads for
large files.

This was reported in: https://github.com/aws/aws-cli/issues/752
Fix issue with scalar/non-scalar lists

Fixes #751, originally reported from:
https://forums.aws.amazon.com/thread.jspa?messageID=534743&#534743

The basic issue was that we were looking at the first element in the
list to determine whether or not we should handle something as a list
or not.  With `--query` you can have a heterogenous list so we need
to check all elements, otherwise you'd get lists such as:

```
foo	[{'Value': 'baz', 'Key': 'bar'}]
foo	[{'Value': 'baz', 'Key': 'bar'}]
```
Remove print statement in test
Add issue to changelog
Merge branch 'text-heterogeneous-list' into develop

* text-heterogeneous-list:
  Add issue to changelog
  Remove print statement in test
  Fix issue with scalar/non-scalar lists
Fix S3 sync issue with keys containing urlencode values

Fixes #749.  This was a regression from the fix for #675
where we use the encoding_type of "url" to workaround
the stdlib xmlparser not handling new lines.

The problem is that pagination in s3 uses the last key name as
the marker, and because the keys are returned urlencoded, we
need to urldecode the keys so botocore sends the correct next
marker.  In the case where urldecoded(key) != key we will incorrectly
sync new files.

Also added an integ test for syncing with '+' chars.
Add compat layer for text based stream writers

In python2, if a stream has no encoding, unicode is encoded
using the default encoding.  In python3, sys.stdout is already
text based (it expects str() types).

In python2, we introduce a compat layer that will give you a
stream writer that accepts unicode and encodes the contents into
the local.preferredencoding().

Simple repro: tag an ec2 instance with a unicode char and run:

    aws ec2 describe-instances | grep TAGS

You'll get a ascii encode error.  With this change you won't.

Fixes #742.
Merge branch 's3-sync-whitespace' into develop

* s3-sync-whitespace:
  Fix S3 sync issue with keys containing urlencode values
Update changelog with #749
Py3 integ test fixes
Code review feedback

* Modified the load-cli-arg event to emit service and operation name instead
  of an operation object
* Cleaned up tests
* No longer access private members for BasicCommand during testing
Add a comment about why get_stdout_text_writer is needed.
Merge branch 'missing-encoding' into develop

* missing-encoding:
  Add a comment about why get_stdout_text_writer is needed.
  Add compat layer for text based stream writers
Add #742 to changelog
Merge pull request #747 from danielgtaylor/custom-arg-paramfile

Allow custom param values to be read from files/urls. Fixes #747.