(PUP-1932) Restrict systemd provider to manage file-based services

Prior to this commit, the systemd provider returned in-memory services.
This had a couple odd consequences, e.g. with 'puppet resource service':
1) short-lived services would come and go, though they are not actually
   managed directly
2) disabled and stopped services wouldn't be reported at all

This commit changes the systemd provider to return file-backed
services.
Add docs badge to README
(PUP-1892) File resources do not work with fileservers that are not the current puppetmaster.

the source parameter makes the 'uri' method private; assumably for security, the actual result is that
noone can get the full URI from the source param. The end result is that when collecting the source data
the file_content class uses full_path instead, which gets magically completed to use the puppetmaster.

If your fileserver is in fact some other remote host, that data is lost. This change makes 'uri' public
and adjusts the content handler so that it properly delivers either a URI as a string, or a
full path without leading slash (which is what the previous state was.)
Use no-daemonize and not forking service

Making puppet fork and systemd to read PID file seems unnecessary complicated.
Adding dependency on puppetmaster to puppet

Sounds like a good idea to wait with start of puppet agent to finish starting
of puppet mater first.
Make relation between service and sysconfig file obvious

There is puppet service but it's environment file is called puppetagent
(probably due to historical reasons). Making the naming more consistent and
obvious.
(PUP-1986) Ignore source_permissions when downloading plugins on POSIX

Module pluginsync is handled by creating a Catalog with a File resource,
and Puppet's File resource defaults to replicating the source file
owner, group and mode. However, owner/group are additionally set to
Process.owner/group for a pluginsync download on POSIX, which will
typically be root during an agent run.

This combination of behavior meant that a root agent run on the puppet
master would cause Puppet's $libdir to be reset to the mode of the first
source module lib, but owned by root.

The puppet master, running as root, chuser's to the service user.  In a
Webrick setup, requests are handled by that service user; in a Rack
setup, it depends on how the Rack service has been setup, but typically
it is the service user again.  So, if the source module had restrictive
permissions, the puppet master, running as the service user, could end
up no longer being able to read $libdir.

On Windows, we were already setting the File type's source_permissions
parameter to :ignore when pluginsyncing.  This commit sets
source_permissions to ignore regardless of the platform, leaving
$libdir's mode unchanged on POSIX as well.

TODO unfortunately this means that owner/group of $libdir are still
being managed on POSIX by pluginsync, which will take precedence over
settings. This seems wrong.
(PUP-2613) Comprehensively test all yumrepo params
(PUP-2150) allow yumrepo params to be set absent

Commit 7b8650e introduced proper validation for yumrepo properties that
should be URLs, but didn't allow those properties to be set absent. This
commit remedies that limitation.
(PUP-2162) support yumrepo baseurl/gpgkey multiple values

The yumrepo gpgkey and baseurl parameters can accept a list of URLs, so
to validate them we need to split the field on whitespace and validate
each value in that list.
(maint) Don't strip whitespace from yumrepo keys

Yumrepo values may have leading or trailing whitespace, and stripping
this can cause resources to flap. Since it's not strictly necessary and
the yumrepo code in 3.4.3 didn't handle this, we can omit this for now.
(PUP-2179) Add test coverage for IniConfig::Section
(PUP-2179) Extract standalone INI file class

The existing Puppet::util::IniConfig::File class is responsible for both
managing a collection of files as well as parsing, formatting, and
storing those files. This overloads the responsibility of this class and
makes it hard to make behavior changes.

This commit extracts a class that represents a single file. Since the
'File' constant is already used this is named 'PhysicalFile' in contrast
to the logical nature of the existing File class. This commit only
extracts the parsing and later commits will add more behavior.
(PUP-2179) Implement INI single file formatting
(PUP-2179) implement storing for single INI files
(PUP-2179) Implement simple INI file collection

This commit reimplements the Puppet::Util::IniConfig::File interface on
top of PhysicalFile objects. This makes for a much simpler and cleaner
implemenatation that we can swap out the implementation of the File
class.
(PUP-2179) Replace Puppet::Util::IniConfig::File

The old Puppet::Util::IniConfig::File class was messy, complex, and had
no test coverage; this commit removes that class and aliases the
FileCollection class to the File constant.
(PUP-2181) Delete ini file entries on absent property
(PUP-2178) Map INI name to yumrepo descr

The yumrepo type uses 'name' as the namevar, while yum configuration
uses 'name' as the repository description. Because of this mismatch the
yumrepo type has a descr field that we need to explicitly map to the
'name' INI property. This commit adds the necessary mapping of that
field.
(maint) Yumrepo boolean values are case insensitive.

When handling boolean values for yum repos, a given value is downcased
before it is checked:

    # yum/config.py
    def parse(self, s):
        """Parse a string containing a boolean value.  1, yes, and
        true will evaluate to True; and 0, no, and false will evaluate
        to False.  Case is ignored.

        :param s: the string containing the boolean value
        :return: the boolean value contained in *s*
        :raises: :class:`ValueError` if there is an error in parsing
           the boolean value
        """
        s = s.lower()
        if s in ('0', 'no', 'false'):
            return False
        elif s in ('1', 'yes', 'true'):
            return True
        else:
            raise ValueError('invalid boolean value')

When validating these parameters we should perform a case insensitive
match to match the yum behavior.