Add a resource model abstraction.

This change adds an abstraction over the raw JSON resource descriptions,
similar to how Botocore has a `ServiceModel` which abstracts its JSON
service descriptions. Advantages of this approach:

* Pythonic interface (e.g. `model.actions[0].request.operation`)
* Encapsulation of minor JSON changes (e.g. field name change)

All of the factory code is updated to use it and documentation code
will use it in the future. Tests have been updated accordingly
and the model has its own tests as well.