(PUP-2519) Create the default directory environment

Directory environments are not guaranteed to exist; Puppet provides a
fallback staticly loaded environment for the default production
environment if it does not exist, but we would prefer to set up a real
directory environment if possible to provide a better experience for new
installations.

This commit adjusts the Puppet::Settings catalog to create the default directory
environment in the first `environmentpath` directory if that directory
exists.

Now that the production directory environment is created implicitly by
the Puppet settings catalog when we have an environmentpath, the
can_enumerate_environments test needs to expect that the production
environment will be there along with the two we have explicitly created.
(PUP-2519) Ignore module directories if env does not exist

Puppet::Util::Autoload will attempt to look up module directories in the
given or configured environment, but there is no guarantee that the
environment exists when using directory environments, and Autoload's
module_directories method fails if a nil environment is being handled.

Given that puppet applications now directly set the current environment
during their initialization and we have adjusted other points in puppet
that used to lookup the configured environment to instead use the
current environment, module_directories now skips and returns an empty
array if no environment is found during bootstrapping.
(PUP-2519) Create fallback environment only for default production

The goal here was to only produce a fallback environment for the default
'production' environment which would only be found if the production
directory environment did not exist.  All other cases would raise an
error during application start up if the environment did not exist.
Except for applications in agent mode which currently need the concept of
the environment they will be requesting, but should not have to create
or verify the existence of a locally matching environment in their
environmentpath.

A few other changes are made to further narrow the scope of code making
open requests for the configured environment:

* indirection request - looks up current environment now, relying on
  this having been set by whatever application is making the request.
* puppet apply - instead of creating a new loader with a single static
  environment, it overrides current_environment instead.
* puppet util commandline - does not attempt to look for additional
  plugins if there is no environment to search in.  It relies on
  application to raise an error instead, if necessary.