MCO-363 Extract normalize_facts from get_fact and make recursive

In dealing with structured facts we need to recursively transform all
non-string scalars to strings, while preserving the hashes and arrays.
MCO-363 Add structured matching semantics to has_fact?

Here we add simple structured fact support to the has_fact? utility
method.

In order to get there we extract the core matching into test_fact_value,
to allow for it to be applied to structured data compound data
structures more readily.  Then we add the semantics for matching
against structured values (any of the the contents of an Array or
keys of a Hash should match the test)
maint - add tests that ensure comparisons are numeric

With a string-wise comparison "100" > "2" yields false (because "1" > "2" is
false and you can shortcut out)

Here we add some additional testing to check that the automatic conversion did
work, and not that "1" > "2".

This should avoid reintroducing a regression that I caused in an earlier
iteration of implementing MCO-363.
MCO-363 Add a fact_data plugin

This plugin exposes the walking of structured facts to the compound query
language.

Some example usages:

   ./mco ping -S 'fact("roles.0").value=base'
   ./mco ping -S 'fact("system_uptime.days")>10'

We split the parameter into path components on the '.', and then recursively
walk from the root facts down, by hash key or array index.