Set.Make2 for functorial cartesian product

See #441. I had to build all three sets (domains and product) because otherwise the abstraction barrier would become unbreakable (product on abstract set implementation is better solved using `Enum`, I believe).