[#59505526] ConfigValidator class
[#59505526] String validation
[#59505526] Hash validation

Hashes validation effectively interates down into a sub-validation for each element of the schema hash "internals"

Errors bubble up into the higher level @errors.
[#59505526] Array validation

Arrays are validated against the subschema defined in :each_element_is, with errors bubbling up
[#59505526] Test array-of-hashes and hash-of-arrays logic
[#59505526] Normalise :type, so we have less surprises
[#59505526] :allowed_empty (default false) for string, array, hash
[#59505526] improve handling of empty values
[#59505526] :required option on each schema element

Certain hash parameters in our data are optional, but if
present need to be checked.

Add a :required option (default == true), to mark a parameter as optional.

If the parameter is present though, check as normal.
[#59505526] Handle unspecified hash parameters

Generally we can assume that if we're specifying all our hash parameters
in a schema, then any parameters outside of that are bogus (typos, schema change, etc)

Allow overriding of this, and also allow any parameters in a hash that does not
provide a schema for its internals (which in our case covers the 'metadata' and
'vars' subsections.
[#59505526] fix error handling bug in config_validator
[#59505526] store input validation schemas

Define the input validation schemas for Vcloud::Launch

Cascade the schema definitions somewhat, so that they are easier
to understand.

It makes sense to store each schema subsection as close to the point
where it actually used.
[#59505526] enable schema checking in Vcloud::Launch

If a schema is supplied to config_loader, then we will check against
it, log errors, and raise an exception if validation fails.

Added tests in config_loader_spec.rb to check validation, and also to
check validation failure.

The tests for config_loader are very specific to Vcloud::Launch though,
it might be worth splitting these out into their respective modules later.
This could happen when we switch Vcloud::NetLaunch to use validation too.
[#59505526] string_or_number validator

cpu and memory are specified in some configs as a bare integer, and in others
as a string.

The string_or_number validator is ripe for improvement, but gets us past this
limitation for now, relatively cleanly.

Integration Test now passes
[#59505526] ip_address validator
[#59505526] allow Regexp :matcher on string validations
[#59505526] test disk size is numeric