Improve have_attributes matcher failure message.

Improve hash attributes failure message by caching values and enumerating in output.

Fixes #667
`matches?` should probably set `@negated = false`.  Consider this use case:

``` ruby
be_an_adult = have_attributes(:age => (a_value >= 21))
expect(person_1).not_to be_an_adult
expect(person_2).to be_an_adult
```

In this case the matcher is first matched negatively, then matched positively, and `@negated` will still be `true` in the second expectation.  Matchers aren't generally used in this manner (and I'm not 100% sure that all matchers would work properly this way, since we don't generally test like this), but it's good to avoid these problems when we notice them.