(maint) Move methods for creating downloaders to factory

Previously, the plugin_handler module was responsible for creating
downloaders and evaluating them. Since all of this happens within a
single method it is hard to test that the downloaders are created with
the correct set of properties. For example, we `ignore` source
permissions when downloading plugins, but we `use` source permissions
when downloading external facts, since those often contain scripts,
which must be executable.

This commit moves the logic for creating the downloaders to a factory
and updates the tests accordingly. As part of this change, the
PluginHandler module is changed to a class and is no longer mixed into
the Configurer.
(maint) Test that external fact syncing depends on external feature

Previously, the test was trying to verify that the downloader objects
were created with the correct arguments, and testing that the
downloader was evaluated twice (since the same downloader was used for
both pluginsync and facts).

However, the downloader_factory_spec now tests that downloader objects
are created correctly, e.g. based on Puppet[:plugindest], so it is not
necessary to repeat that here.

This commit modifies the test to ensure the Downloader#evaluate
methods are called for both downloader objects, and adds a test to
ensure we skip downloading facts if the external facts feature is
false.
(PUP-2907) Ignore source permissions on windows for fact sync

Previously, puppet on windows would always issue a warning:

    Copying owner/mode/group from the source file on Windows is
    deprecated; use source_permissions => ignore

Regardless of what was in the user's catalog. The reason is because
puppet applies an internal catalog to download external facts, and that
catalog contains a file resource whose source_permissions parameter is
set to `:use`.

This is done because external facts are often times scripts, which must
be executable for puppet to invoke them. See commit 21edcd67b for
PUP-2705.

This commit makes it so that source permissions for external facts are
ignored on Windows, while preserving existing behavior on other
platforms.

Permissions can be ignored on Windows, because puppet always has full
control of files it creates.
Merge pull request #2970 from kylog/joshcooper-ticket/master/PUP-2907

ticket/master/pup 2907