Use 2-3 trees

This change uses balanced 2-3 trees as the underlying map implementation to change expected bounds to worst case bounds. This seems to give a slight improvement in the performance of ps-in-ps.

`Data.Set` has been modified to use `Data.Map` under the hood, to save code.

The test suite is also improved.