Add validation classes

This reworks how all the `*_node` methods are defined to pull the common patterns of mutation (before/after) and validation out.
If something HAS to be overridden in a subclass, I usually make it `raise NotImplementedError` in the superclass (i.e. here).