Generalize plan snapshot

Im not 100% happy with `SnapshotPlannerSpec` so any suggestions to make it better would be much appreciated.
A lot of the code below here looks like it might be more generally useful. Is there a place for it in the production source tree somewhere.