Re #7785. A new exception type for use by live listeners.

This will allow listeners to pass control back to LoadLiveData rather
than blocking if not ready to return a workspace. This will allow things
like algorithm cancellation. Unlike other exceptions it will not stop
the algorithm.
Re #7785. The algorithm side of waiting for a run to start.

LoadLiveData catches the NotYet exception, logs it and waits 10 seconds
before calling extractData() again. While waiting it listens for user
cancellation of the algorithm.
Listeners can throw this exception to 'pause' things - any other
exception type will stop the algorithm.
LoadLiveData had to be made a 'proper' child of StartLiveData for the
cancellation signal to get through.
Re #7785. Hooks for testing the use of the NotYet exception.

Add a property to have the FakeEventDataListener throw the NotYet
exception a given number of times. This allows testing of the
behaviour on the algorithm side of this work.
Re #7785. SNS listener throws a NotYet exception when appropriate.

In particular, it throws it if data was requested from the start of the
run but the instrument is not in a run. This allows the user to cancel
the algorithm or wait until a run starts, at which point the data will
flow.
It will also throw if the workspace has not been initialized, though
not immediately as experience shows that it can sometimes (SEQUOIA for
example) take some time for the instrument to be loaded.
Merge remote-tracking branch 'origin/feature/7785_snslistener_out_of_run_behaviour'