TestAppRunTimeout: Fix OnStop_timeout flakiness
TestAppRunTimeout: Fix OnStop_timeout flakiness

The OnStop_timeout test was flaky
because of the very small StartTimeout.

We would sometimes hit a condition where:
App.Run calls App.Start with a timeout of 1 millisecond.
This takes just long enough that App.Start gives up.
As a result, App.Run does not call App.Stop,
which causes the test to fail
because we don't see the Stop event.

Resolve the flakiness with the use of a mock clock.
Now, time doesn't advance while the start hook is running,
so we can be certain that the really long OnStop hook is invoked
and has a chance to time out.

Note that the subtests for this test share hooks,
but they can't share mock clocks (`clock.Add` is not thread-safe)
so we instead use "hook builders" that build hooks
given the mock clock.

uber-go/fx,uber-go/fx