[action/deploy/environment] Use visitor pattern

The Util::Attempt pattern previously used worked very well for
operations that could be pipelined, but failed horribly for operations
that needed to perform work before and after recursing into nested
objects. This commit replaces the Attempt pipeline by using visitor
methods implemented on objects to walk the entire deployment object
structure and update objects as needed.
[environment] Only update modules once per deploy

The original recursive module updating mechanism for new environments
was implemented inside of the environment, which broke encapsulation and
responsibility of concerns. One of the impacts of this is that if a new
environment was deployed and the `--puppetfile` flag was given, modules
for that environment would be updated twice. This generally would have
little effect aside from increasing the total entropy in the system but
was obnoxious.

This commit resolves this by entirely removing the responsibility of
updating modules from the environment and expecting the caller to handle
this. Because the calling code will know if the Puppetfile needs to be
updated and if the environment was created, it can deduplicate the
module update process.

This change is slightly backwards incompatible because it changes the
behavior of #sync. However the affected APIs are pretty far inside of
r10k, and the outward facing behavior of r10k does not change. This
should only impact developers that are hooking deep into the internals,
and I have no idea if there are any such developers.