Go back to original approach of not using Equality[I] recursively
for inner types, but instead just using the Equality[O] for the
outer type, but using recursive constraints checking for inner types,
which required that I come up with a way to differentiate between
a "cooperating" equality constraint and a non-cooperating one. Ended
up with a Cooperative trait that I mix into EqualityConstarint[A, B]
to indicate that types A and B can equal each other symmetrically if
you just pass the right hand one to the left hand one's == method.