Use strings for equal val provider. For variety!
Using symmetric while instead of foreach fixes most of the problems.

Also tweak some of the docs.
Add a case ensuring that empty list structures can be equal.