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 we care about returning true/false from `#valid?` - should that have `!!test` in it in the base class, rather than it being up to each subclass to make sure they return true/false rather than truthy/falsy?