Add validation classes

This reworks how all the `*_node` methods are defined to pull the common patterns of mutation (before/after) and validation out.
Should you not call `dateish.valid?` to make sure it called `dateish.strftime` in the test?