Implement resource collections

This change implements support for resource collections that mimic Django's
query set API so that things like this are possible:

    >>> s3 = boto3.resource('s3')
    >>> for bucket in s3.buckets.all():
    ...     for obj in bucket.objects.limit(100):
    ...         print(bucket.name, obj.key)

Implements the following for collections:

* Non-iterable collection manager (e.g. `s3.buckets`)
* Iterable `ResourceCollection` base class (e.g. `s3.buckets.all()`)
* Chainable resource collection API (via clones)
* Filtering via `.filter(Arg1=1, Arg2=2)`
* Control item count via `.filter(limit=20)` or `.limit(20)`
* Control page size via `.filter(page_size=100)` or `.page_size(100)`
* Indexing and slicing (e.g. `s3.buckets.all()[2:5]`)
* Exposing `all`, `filter`, `limit`, and `page_size` on the manager
* Updated documentation

Also adds tests for all the relevant features. Note that batch actions
are *not* included in this change.

cc @jamesls, @kyleknap, @garnaat 
In this case `parent` is both a parameter and an instance variable. This way, if you are passed a collection you can easily get back to its parent resource:

```python
bucket = s3.Bucket('my-bucket')
collection = bucket.objects.filter(Abc=123)
assert bucket == collection.parent
```

My thought process is that SDK users and downstream libraries may find it useful. For example, it's the only way to get the service name or the low-level client:

```python
def foo(collection):
    client = collection.parent.meta['client']
    for item in collection:
        # Make a low-level call
        client.set_item_attribute(ItemName=item.name, AttributeName='foo', Value='bar')
```