Update resource string representations

This makes printing resources much more useful by including the class
name, any resources identifiers, and the region:

```python
>>> import boto3
>>> s3 = boto3.resource('s3')

# Before
>>> s3.Object('boto3', 'sun.jpg')
<boto3.resources.factory.s3.Object at 0x1098bf080>

# After
>>> s3.Object('boto3', 'sun.jpg')
s3.Object(bucket_name='boto3', key='sun.jpg') in us-east-1
```

This gets even more interesting when mixed with collections,
e.g. `list(s3.buckets.all())` is now actually useful since you
can easily see the bucket names.

cc: @jamesls, @kyleknap 
We have already standardized on pep8.  I actually find it jarring to not see it this way, specifically because I'm so use to reading pep8 compliant code.  Let's continue to use pep8.  I don't really think we should be in the business of adding our own exceptions to it.  It's a standard in the python community.  There are other pep8 compliant ways to achieve what you want, see my original link above.

As an aside, I personally don't override the standard error messages from the assert* methods unless the failure message is completely non-obvious.  Let's take this specific message above for example:

```
>>> class Foo(object): pass
...
>>> assert_in('bar', repr(Foo))
AssertionError: 'bar' not found in "<class '__main__.Foo'>"

>>> assert_in('bar', repr(Foo), 'Foobar identifier not in repr')
AssertionError: Foobar identifier not in repr
```

Note that the second example gives me less information that in the original default error message, and the extra bit about it being an identifier can already be assumed from the test name test_identifiers_in_repr.