The causes of the runnable loop are as follows:
1. In Release we have a special case to make sure OnStart&OnStop are always
called. We do this by dispatching a runnable that calls DoNotifyListener.
2. DoNotifyListener is called, then the reference to the channel is again
dropped. But at this point only OnStartRequest was called, and
ContinueDoNotifyListener was added to mEventQ. That means another
runnable would be dispatched.
While the loop was broken in the previous patch, we still want to ensure
OnStopRequest is called before the channel is released, so this patch
adds an argument to DoNotifyListener to select whether ContinueDoNotifyListener
should be called synchronously or dispatched to mEventQ.
Original Revision: https://phabricator.services.mozilla.com/D202798
Differential Revision: https://phabricator.services.mozilla.com/D204063