(maint) refactor solaris virtual fact to use timeouts

The previous implementation of the solaris virtual fact used a
resolution inside of a resolution because the original author (me)
didn't know that the executed code already _was_ a resolution. This
commit deduplicates the resolution and makes the entire resolution
timeout like one would expect.
(FACT-273) Resolutions should be able to reference their facts

The fact-resolution relationship is one to many, and there is
information in the fact that we need in the resolution. This commit
directly couples facts and resolutions for this purpose.

This commit also adds a healthy refactoring of the fact and resolution
tests to use modern rspec expectations and use imperative phrasing in
specifications.
(maint) Add more context when resolutions fail to evaluate
[FACT-239] Cleanly evaluate blocks in resolution context

doing an `#instance_eval` on another object is a little bit evil and
entangles the calling object and object being evaluated. This commit
defines an `#evaluate` method on resolutions so that resolutions can
define the behavior of evaluating a block.
(FACT-239) Delegate Fact#add to Fact#define_resolution
(FACT-239) Move resolution interaction to facts

Facter::Util::Collection never directly interacts with resolutions, so
it doesn't make a lot of sense for the collection to be setting options
on resolution instances. This commit pushes the last of that
entanglement into Util::Fact, which does interact with resolutions.
(FACT-239) Expose resolution type controls

This commit exposes the ability to create different types of
resolutions. When a resolution is being created the `:type` option can
be specified, creating either a simple resolution (using `:type =>
:simple`) or aggregate (using `:type => :aggregate`). If no type is
given the type defaults to simple.

If a resolution is redefined the requested type is compared against the
currently existing resolution. If the types are mismatched an error will
be raised since there's no particularly good way to resolve this
discrepancy.
(maint) Iteratively deep merge values for default aggregate

Without this commit the aggregate deep merge behavior would try to pass
all chunk values to the deep merge method at once, which was pretty
broken. This commit uses inject to iterately merge all values.
(maint) Clean up facter specs

This reorganizes tests against the top level collection, deletes some
tests that have absolutely nothing to do with the Facter object, and
removes tests that check for a method since other tests will fail if
those methods are removed.
(FACT-239) Implement Facter.define_fact

This allows calling classes to create or reopen a fact by itself,
without interacting with resolutions.
(maint) Remove nonfunctional tests

Passing a block to #expects() ignores the passed block which means that
this code was catching the wrong thing and we don't want to test this
anyways.
Merge pull request #633 from adrienthebo/refactor/facter-2/associate-facts-and-resolutions

Refactor/facter 2/associate facts and resolutions
Merge pull request #624 from adrienthebo/feature/facter-2/fact-239-aggregate-resolution-dsl

Feature/facter 2/fact 239 aggregate resolution dsl
(maint) Explicitly require tsort

The DirectedGraph class was trying to use the TSort library but that
library was not explicitly required, which is surprising that this ever
worked. This commit adds the relevant require to sort this out.
Merge branch 'maint/facter-2/include-tsort' into facter-2
Merge branch 'facter-2'

Conflicts:
	lib/facter/virtual.rb