simpler core: "distinguish"

We no longer rely on Ord implementations to be correct.
The confusing "eq_and_more" primitive was replaced by "distinguish",
which does the same thing except it is the Left and Right constructors
which are compared for equality. This allows the "more" part to have
different types depending on the "eq" part, which reduces the need to
call undefined everywhere.

Unordered pairs of pairs relied on being able to use arbitrary Ord
instances, and as result its implementation had to be removed. It is
still theoretically possible to implement it, but we will need to
implement unordered Ord variants for all types.