Support running Puppet masters from raw gems rather than apt packages.

Ok guys, this is a total work in progress... I'll likely make 30 more commits before its ready, so don't treat this as a merge-able PR. Instead, I'm looking for your feedback on my re-structuring of the classes into parameterized classes. I strongly suggest this model because its far more easily unit testable (see how much simpler the unit tests get). Additionally, it makes things a bit more explicit (rather than doing class-to-class private variable sharing, which is pretty dangerous).
Oh one more thing. There is a massive performance hit when writing out every single test into its own `it do ... end` stanza. We have around 900 tests in our repo, and we sped the tests up by nearly 50% by condensing each set of tests into groups of `it do ... end` sections.

The caveat to this approach is that the first test that fails inside of a single `it do ... end` stanza causes the whole test to fail, so sometimes if you have multiple failures it can be a little harder to debug. The plus though is that you still get the failure, but the tests execute much much faster.