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.
I was thinking again about my comment that the the types cannot be statically determined.  Truly there is more information statically available than we have access to (including the expected object's type).  For the simple (non-recursive case) I do not see any reason why all the relevant type information could not be statically available.  To handle recursion, Expressions would be needed.

I do not think this would not be a simple refactoring but it could be valuable.  I could see it simplifying the implementation of IEquivalencySteps though EquivalencyValidator (and related classes/interfaces) would become a little more complex particularly in determining what steps are applicable.  I have not tried writing any code to see what unforeseen issues would be encountered.  I would consider this refactoring a  separate project.