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 
It may make sense to rename `page_size` to a verb, but I don't have any great suggestion off the top of my head at the moment.

We may also want to consider whether calling these two creates a clone or sets attributes on the existing collection instance.

As implemented above, you can think of the following as equivalent:

```python
for obj in bucket.objects.page_size(50):
    print(obj.key)

for obj in bucket.objects.all(page_size=50):
    print(obj.key)

for obj in bucket.objects.filter(page_size=50):
    print(obj.key)

collection = bucket.objects.all()
collection.params['page_size'] = 50
for obj in collection:
    print(obj.key)
```