(PUP-2610) Maintain context during application exit

Because of the way rack servers get configured by puppet, the application
system needs to maintain any context information that is setup while starting
even after the application has exited. This is because the rack app is
created by calling the "master" application and using the return value (which
threads all the way back through the application and command line layers) as
the rack app. When the contexts were removed on the way out of the
application they also removed the setup for how environments were loaded.

This also required that there be a way of undoing a series of context pushes
without knowing how many had been done. For this there is now a mark and
rollback capability in the Puppet::Context system. This is used in the tests
to always return to the context that was present at the start of every test.