Json skeleton

This pull request made a couple changes and feature additions.
I added two new custom arguments:
* ``--generate-cli-skeleton``: This uses botocore ``ArgumentGenerator`` to print a JSON skeleton to standard output that can be used as input to the cli. This JSON can be redirected to a file and then filled out and used as input to the CLI.

* ``--cli-input-json``: This takes JSON (typically generated from ``--generate-cli-skeleton``) from either a string or some file and uses that as the input to the command line operation. Additional arguments can be added to command line. If there are collisions between the two, the value from argument is used over the value from the input JSON

To create these features, I made the following changes to the cli driver:
* ``enable/disable_call_operation``: These are methods that can be called to prevent the ``ServiceOperation`` from performing the botocore service operation call.

* emit the event: ``building-argument-table-parser``. This gives us the ability to determine all of the arguments that are going to be passed to the parser (including arguments that were added through a hook). This was needed to ensure the parser does not throw errors for missing required args.

* emit the event: ``calling-service-operation``. This allows us to see the entire configuration of the ``ServiceOperation`` before a call is made to botocore. That way we can edit the parameters that are going to be included in the call or even determine if we want the call to happen.

cc @jamesls @danielgtaylor 
I checked. The ``invoke()`` method returns zero at the end.
https://github.com/aws/aws-cli/blob/develop/awscli/clidriver.py#L567