Subset reorganization

This PR reorganizes how subsets are associated with datasets.

Under the old model, each dataset managed an independent collection of subsets. This made applying subsets to multiple datasets cumbersome -- you either had to highlight both subsets when defining a selection, or copy-paste subsets onto each other. Furthermore, it wasn't obvious when subsets in different datasets shared internal state.

The new model introduces a SubsetGroup container. This container adds identical subsets to all datasets automatically, and all subsets share the same underlying SubsetState. Selections are always applied to all datasets, which I think is more intuitive.