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 
Do you think deepcopying makes sense here?  I could see how someone might find the fact that we're doing a shallow copy non-intuitive:

```
In [19]: first = ec2.instances.all()

In [20]: instance_ids = ['i-1', 'i-2', 'i-3']

In [21]: second = first.filter(InstanceIds=instance_ids)

In [22]: instance_ids.append('i-4')

In [23]: third = first.filter(InstanceIds=instance_ids)

In [24]: first.params
Out[24]: {}

# This part here, second has the `i-4` automatically added to it.
In [25]: second.params
Out[25]: {'InstanceIds': ['i-1', 'i-2', 'i-3', 'i-4']}

In [26]: third.params
Out[26]: {'InstanceIds': ['i-1', 'i-2', 'i-3', 'i-4']}
```