Runs a Driver on its own background thread — the Driver analog of
crate::pipeline::Pipeline, minus everything that only makes sense
for a dataflow graph (Clock, Pause, Seek, the wire callback).
Checked, not blocked on: a Driver owns a single self-contained loop
with no downstream dataflow graph to cascade a stop through (unlike
crate::pipeline::Pipeline’s control channel, which has to reach
every Sink a Queue boundary away before it can call Stop fully
handled). So DriverRunner::stop just flips a flag instead of
sending something that has to be received and acked — nothing here can
reproduce the deadlock that pattern is prone to when a receiver can
legitimately go away without ever looping back to check it (see
Pipeline’s own control_rx field docs for that history). Callers
that need to know run has actually finished watch
DriverRunner::bus instead, same convention as Pipeline.
A background task with no Sink/Source ports of its own — nothing to
push into, nothing to pull out of this object; whatever it produces
or consumes happens through other Sink/Source pairs it mints on the
side (e.g. WebRtcPeer handing out
WebRtcTrackSink/WebRtcTrackSource). Reach for
crate::pipeline::Pipeline/crate::element::SourceElement instead
for anything that actually has a src_pads() dataflow graph to wire —
Driver deliberately has no Pause/Seek/Clock, none of which have
a sensible meaning for a connection that isn’t part of one.