Cast to correct types for list-structure(list-scalar, scalar)

This modifies the shorthand JSON parsing to make sure a list of structures
are cast to the correct types based on the service model. Previously they
would all be set as strings, for example with EMR:

```
$ aws emr modify-instance-groups --instance-groups InstanceGroupId=foo,InstanceCount=3

Invalid value ('3') for param element of list:InstanceGroups of type list
```

In the above, the `3` was parsed as a string rather than an integer. This
update uses `unpack_scalar_cli_arg` to fix the issue by casting to the proper
types.
Fix issue #765 with non ascii characters in user-data

Read in the file:// contents as text, which is decoded via
locale.getpreferredencoding().

This introduces a py2/py3 compat_open so that you can open
a file with a encoding argument (not availble in py2's open()).
Remove arg_types in favor or args
Merge pull request #776 from danielgtaylor/shorthand-unpack

Cast to correct types for list-structure(list-scalar, scalar). Fixes #776.
Merge branch 'unicode-user-data' into develop

* unicode-user-data:
  Fix issue #765 with non ascii characters in user-data