(PUP-2159) Serialize node.environment as environment_name

Puppet::Node used to implicitly lookup and set an environment instance
when deserializing it's environment attribute String.  On an agent run,
with directory environments set, this was likely to produce a node with
a nil environment.

Henrik Lindberg and I changed node to deserialize the environment to an
environment_name attribute, separating the process of deserialization
from lookup and assignment of an actual environment.  The configurer can
then check to see whether the node already has an environment, and if
not, if it has an environment_name, it can create a remote environment
instance for the node so the agent can proceed without needing a
directory environment to exist.
(PUP-2519) Set environment for request or fail explicitly

The Indirector::Request#environment= setter would fall back to looking
up an environment from the environment loaders if given something that
was not an actual environment instance. If directory environments have
been set, this can return nil, and while a Request#environment will fall
back to the current_environment, there was no warning that you have
attempted to set an environment and been ignored.

To make this clearer, the setter will now first attempt to use the
current_environment if it matches the given environment name, and will
explicitly raise an EnvironmentNotFound error if no matching environment
is found. The use of the current_environment with a matching name is
preferred over looking up a configured environment because there may be
no directory environment to load.