Add waiter models

This re-adds #985, and fixes a bug where creating a client without a region would sometimes generate an error.  The fix here is so use the waiter_model (via the newly added `get_waiter_model` from botocore).  From the [newly added commit](https://github.com/jamesls/aws-cli/commit/b89d6f012a0a1206bf93e3298f64cc13e1842055):

   Update waiters to use the new get_waiter_model

    This fixes an issue where previously we were creating a client
    without specifying a region, which in certain cases would trigger
    an error.  Now we only use the waiter model to generate the necessary
    commands.

    As part of thie change I went ahead and just switched the invoke
    to just use the service/operation object.  This isn't ideal, but at the
    same time, it's pretty clear that for the time being there's no way
    to do this entirely with just clients.  Given that's the case, I don't
    feel it's that imperative to use clients where possible.  When
    we switch to clients, this module will need updates regardless.
    It also simplified the code a little bit.

Also, the CI build will fail until the `get_waiter_model` method is merged,
(depends on https://github.com/boto/botocore/pull/376).

cc @kyleknap @danielgtaylor