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).
using resource compression is generally against the style guide:
https://docs.puppetlabs.com/guides/style_guide.html#compression

I'd prefer to keep the package declarations independent where possible; however I can see pulling the list of package name(s) to add as a variable from puppet::defaults::puppet_agent_packages or some such, to facilitate the differing package names, or sometimes additional packages, (as there is no puppet-common package in rhel-esque systems)