Recursion tracking in deep comparisons.

- Add an option, on by default, to track recursion in objects and skip them when we encounter the same pair of objects again within themselves.

Note that we use object.ReferenceEquals for comparison, so this would not work for value types, but it would still work for reference types and a recursive loop is impossible without at least some reference types. This handles circumstances where two objects' .Equals method returns the same ignoring parameters which aren't the same.