I think "something you can attach listeners to" pretty much means pub-sub (the difference is how often you publish; in replay mode we publish once in the beginning). I propose the following:

trait SparkListenerBus
ReplayListenerBus extends SparkListenerBus
LiveListenerBus / PollingListenerBus / AsynchronousListenerBus extends SparkListenerBus