Properly load a project's transitive dependencies

Before this fix only a project's top-level dependencies were being 
loaded. This meant the `Omnibus::Reports.pretty_version_map` and 
`Omnibus::S3Cache` were working for only a subset of a project's 
true dependencies.
Ensure a component is only added to a library one time.
Add `whitelist_file` to software DSL.

This allows an individual software definition to declare files that
should be ignored during health checking. Currently the JRE software
definitions are the only components using this functionality but it was
previously hardcoded in the Omnibus framework!
Remove hard-coded whitelist files form health check

We now take advantage of the `whitelist_file` keyword which is part of
the software DSL.
Raise an exception if a project's dependency is not found

This creates a much nicer error message than the "can't convert nil into
String" message that was being returned!
Merge branch 'transitive-dep-fixes'
v1.2.0