Decouple checking for application completion from replaying

This involves moving a chunk of logic from ReplayListenerBus. Previously,
the ReplayListenerBus also takes care of parsing logging information, which
requires it to understand the format of EventLoggingListener. This leads to
increased complexity if we want to check whether an application has completed
independently from replaying its logs, as we do in HistoryServer.

This wide refactoring also affects Master, which must now go through the
same code path as the HistoryServer to parse the logging information before
replaying events.