Improve have_attributes matcher failure message.

Improve hash attributes failure message by caching values and enumerating in output.

Fixes #667
I find that I prefer phrasing the negation positively (e.g. `a_string_excluding`) rather than simply negating it with `not` -- in the latter case, you can wind up with confusing failure messages due to having double negatives (e.g. "expected not foobar, but did not").