Introduce Application abstraction

Originally, this work was intended to fix a bug were paths on the
command line of a Play 2.2 application were not relative to the root
of the running Play application (because Play changes the working
directory).  In order to fix this problem, the codebase had to be
changed to use Pathname instead of File, Dir, and Strings.  This
allowed us to more easily calculate relative paths.  In addition, to
uniformly guarantee that $PWD was prepended to all path related to
+JAVA_OPTS+ an Application abstraction was introduced.  It
encapsulates the common behaviors done by components so that they are
handled consistently.  This abstraction isn't required to be used (all
of the context variables still exist) but it should be considered the
way forward.  Eventually, the context variables will be deprecated and
removed in favor of this abstraction.  Finally, the codebase was
cleaned up to meet the following set of rules:

* Minimize the use of Pathname.new
* Minimize the use of File and Dir
* Minimize the use of Shell (in favor of FileUtils)
* Minimize the use of @app_dir

[#59473228][#57290028][#59331620]