Separate validation for Razor::Matcher from Razor::Data::Tag

These patches remove the `rule` field from `Razor::Data::Tag` and replace it with a `matcher` field, which contains a (serialized) Razor::Matcher object. Separating the matcher from its tag allows for independent validation of the matcher object and its rule. `Razor::Matcher` also gets a `#valid?` method which statically validates the internal rule. In particular, it requires that arguments are of expected types, and that nested operators return expected types.

The purpose here is to enforce a more strict and less Ruby-esque notion of the defined operators, to the point where `Razor::Matcher` rules are implementation-language-neutral.