(PE-3657) Added get-shutdown-reason and use by bootstrap test utils

This commit includes a new function on the shutdown service,
get-shutdown-reason, which can be used to get the current shutdown
reason (if one exists) without blocking the current thread until the
reason promise is realized.  The internal get-app-shutdown-reason
function provides a way to get at this new function via a handle to the
TrapperkeeperApp.

This commit also includes changes to the bootstrap testutil functions,
which now make use of the current shutdown reason to translate a failure
to bootstrap without encountering an error into an exception thrown up
the stack.  The bootstrap testutil functions also include overloads with
an optional boolean argument which controls whether or not the failure
to bootstrap should result in the TrapperkeeperApp instance being
returned to the caller (true) vs. an exception being thrown (false, and
the default value).

This commit also factors a few common assertions made across several of
the shutdown tests into a helper function.
(PE-3657) README.md and shutdown updates for Trapperkeeper reloaded pattern

This commit fixes up the ability for the "reloaded" pattern to be used
for Trapperkeeper development.  In a prior commit, the build-app
function, used by the "reloaded" pattern examples, would no longer work
if called without a promise argument.  In this commit, build-app can be
called with or without a promise.  If it is called without a promise, a
promise is created and used within the function.  If it is called with a
promise, that promise is passed through to the shutdown service.

This commit also wraps a try/catch around the `init` and `start`
functions in the TrapperkeeperApp implementation with a corresponding
log statement.  This helps for detecting errors when working with the
reloaded pattern in the REPL, where these functions are called directly.
In the prior commit, only functions which wrapped the TrapperkeeperApp
functions would log errors.

This commit also includes some updates to the README.md.  The README.md
documents that `stop` functions may now be called on services even if an
exception were thrown during execution of a service's `init` or `start`
function.  Also, the document includes an updated form of the "reloaded"
pattern REPL example with some code which would help translate a
boot-time shutdown-on-error into an exception from the init or start
call that would be easier to detect while working in the REPL.