Add validation classes

This reworks how all the `*_node` methods are defined to pull the common patterns of mutation (before/after) and validation out.
I'd be tempted to use `===` here to lose the conditional.

```ruby
a = "str"

String === a # => true
Fixnum === a # => false

-> value { value[/str/] != nil } === a # => true
-> value { value[/braaains/] != nil } === a # => false
```

Means you could just do `(expected_class || block) === value` here.