implement equivalent sorts

Very crude first implementation. Some tests are expected to fail. Not ready for merge.

@yilongli @andreistefanescu can you have a look?
an alternative is to have one representative for each equivalence class, that is, a map from T to T