ReferenceBlockSplittingVariantIterator

I would like to merge this so we don't have to use special branches in foghorn anymore.

This is a rebased version of #327 plus:
* an update to make the Variant mutators private until #320 is ready
* CMake updates

Thanks to @kgururaj for adding the N-base feature to fix #306
you don't need to list the initializers for a default constructed object. `ReferenceBlockSplittingVariantIterator() = default;` will do what you want here and possibly more efficiently.