Provide expected argument datatype for commands

In order for the client to know how to format data for arbitrary commands, the server needs to provide this information. This includes the expected JSON datatype as interpreted from the validation framework.

Included in this commit is the change to only support one datatype per attribute. If other datatypes are desired, they can be supported via the `conform!` method. `update-node-metadata` and `modify-node-metadata` have been updated to accept both `_` and `-` in their arguments that previously only accepted the non-standard `_`.

Fixes https://tickets.puppetlabs.com/browse/RAZOR-216
Make sure that nodes with nil facts/metadata/state do not case an internal error

When a node had nil facts/metadata/state, the matcher could fail by trying
to call nil.[] in value_lookup; this change makes sure that doesn't happen,
and that evaluating ("fact" "foo") against a node with nil facts actually
raises a RuleEvaluationError

This change also adds some light testing for Tag#match? as that is the main
user of matchers

Issue: https://tickets.puppetlabs.com/browse/RAZOR-254 (partial fix)
* spec/data/tag_spec.rb: check that Tag.match raises when rule eval fails

Other things, especially Node.checkin depend on that behavior; out of
overabundant caution, add a test for that. It is also checked indirectly in
the tests for Node.checkin
Tag#eval_nodes should catch rule evaluation errors and log them to the node

When matching against a node fails for some reason, we want eval_nodes to
continue to evaluate against other nodes; to make it possible for users to
spot problems, we log the evaluation failure into the affected node's log.

Before this change, eval_nodes had raised the RuleEvaluationError causing
the background processing for update-tag-rule to fail in its entirety with
no indication to the user what exactly was wrong, other than a cryptic
entry in the server log

Issue: https://tickets.puppetlabs.com/browse/RAZOR-254 (final change)