Improves correctness of dictionary equivalency assertions, incld. respecting declared type

This brings the same behavior collections have relating to respecting declared type to dictionaries.  I mentioned in #141 that these should be handled as well, though it has taken me some time to get the time to complete the implementation.

This also corrects an edge case where some dictionary implementations were being treated as collections (rather than dictionaries) because IDictionary<TKey, TValue> does not implement IDictionary.
Then it also puts quotes around the list of interfaces.  While not particularly detrimental to the failure message, they do not help either.

I see that the formatting support can be useful and I used it for the failure when there is an unexpected key, but I am not sure this is a case where it should be used.