Fix stop/start and add plist support to launchctl module.

All plists have to be read on first access as we don't know
if all the labels in a plist file match its filename. Not all
plist files are XML, some are binary, maybe even JSON. Thankfully
we have the plutil tool provided by the system for doing conversions.

Launchctl `stop` is not the same as stop on most systems. It will
kill the process, however most services will start up again as it's
very common for a service to have both `RunAtLoad` and `KeepAlive` set
in the services plist file.

Similiarly, `start` start will only start a service that has
previously been loaded without the `RunAtLoad` key in the service plist.
The man page for `launchctl` also notes that expected usage of `start`
is for debugging and testing.

These changes do not find per-user `~/Library/LaunchAgents` services
at the current time.
Merge pull request #4482 from jasonrm/feature-launchctl-plist

Fix stop/start and add plist support to launchctl module.