implement custom-set for haskell

I didn't go all the way to re-implement Set efficiently, but I did use a binary tree rather than a list :)
/cc @soapie @qnikst @pminten @sjakobi
I think there's an argument for being consistent.  The Data.Set docs talk about this:

> Note that the implementation is left-biased -- the elements of a first argument are always preferred to the second, for example in union or insert. Of course, left-biasing can only be observed when equality is an equivalence relation instead of structural equality.