add a Set trait

Closes #2640, and now that `()` is zero-size it makes the most sense to just implement sets as (opaque) adaptors on top of map types.

I haven't added `map::HashSet` because that module needs a lot of work first. It doesn't use explicit self, and the mutability is all messed up (and will require a lot of porting). I think I'll just add a new Map trait to the container module and throw out most of `map` after converting everything to the new trait.