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.
The Expression invocation?

Technically, we could up-cast both to IEnumerable or and have LINQ count them.  I am not sure the impact of that when multiple interfaces are implemented and those cases would need to be thought through.  Barring that, it becomes a choice between the Expression API and the Reflection API because we cannot statically determine the types being used.  I think the results are cleaner with the Expression API.

The only other simplification I could see for the method of asserting the same length is to implement it with duck typing.  Then you would not be the need to have the reified generic type in order to invoke the `Count` member.  That may bring its own issues in cases when there are multiple `Count` members.