Migrate to a separate "command" class

Commands were previously defined with a trivial DSL in the app.rb file, which
worked reasonably well while we had a fairly small and simple set of commands.

With the addition of a validation framework, though, this began to get
cumbersome, and as we extend the set of features that are "about" commands,
rather than commands themselves (eg: help, documentation, browsing), this
becomes harder and harder to keep sensibly structured.

The goal of this series of changes is to move away from a single file
definition into something more, well, OO-based: a single class per command,
defining the basic behaviour of an individual request.

This also allows us to attach metadata about the command to the same place,
such as schema definition for validation, help generation and text, and
so forth.

https://tickets.puppetlabs.com/browse/RAZOR-179

Signed-off-by: Daniel Pittman <daniel@rimspace.net>
Validate `move_policy` command.

https://tickets.puppetlabs.com/browse/RAZOR-178
Validate `add_policy_tag` command.

https://tickets.puppetlabs.com/browse/RAZOR-178
Validate `remove_policy_tag` command.

https://tickets.puppetlabs.com/browse/RAZOR-178
Validate `modify_policy_max_count` command.

https://tickets.puppetlabs.com/browse/RAZOR-178
Validate `update_node_metadata` command.

https://tickets.puppetlabs.com/browse/RAZOR-178
Validate `remove_node_metadata` command.

https://tickets.puppetlabs.com/browse/RAZOR-178
Validate `modify_node_metadata` command.

https://tickets.puppetlabs.com/browse/RAZOR-178
Implement help text DSL for commands

This adds a new DSL for defining help text on commands.  The `summary`,
`description`, and `examples` commands at the class level attach parts of the
documentation to the command object itself.

While these presently allow us to attach the documentation and provide no
mechanism to communicate it to the user, they are the basis for building that
facility and allow us to work in parallel on building and presenting the docs.

Signed-off-by: Daniel Pittman <daniel@rimspace.net>
Template and task revamp

There was confusion around finding templates and tasks in cases of task inheritance. For one reason, tasks are referenced in their .yaml files by name, but are uniquely identified via name and os_version. Additionally, having the .yaml files separate from their respective template directory is counter-intuitive. Now, yaml files have a consistent name (metadata.yaml) and exist alongside their templates in one self-contained task folder.

Included in this changeset is:
- Removing os_version from path
- Adding ".task" to task folder name
- Using "metadata.yaml" as a taskname convention inside task folder
- Allowing "/" and preventing "$" in task names.

Fixes https://tickets.puppetlabs.com/browse/RAZOR-154