[WIP] Don't merge yet - Full refactoring

This follows on from the other PR I made where I restructured the params without changing the API.  This work overhauls the API to be more consistent with standards, separates things out into multiple classes, and attempts to improve the structure of the params so that we don't have duplication all over the show.  We still rely on "$real_" parameters but it's still better than what we had before.

I tested this manually on Redhat and Ubuntu and ran into what seems like a timing issue - it claimed the user wasn't present after the package installed and it wanted to set the permissions.  This didn't show up on retests via rspec-system however.