Clean up the last HashSet iterators

Now that SetAlgebraItems is wrapped in its own type, it might as well have a real implementation.

The first commit changes the implementation of SetAlgebraItems on its own, and is backwards compatible.

When I was in this area however it felt much saner to simply split the two iterator types into IntersectionItems and DifferenceItems, they are both two quite trivial implementations. So that is the second commit. This is then a breaking change, because the return types of .difference() and .intersection() change.