A DataDevice will have zero or one active DataSource as the seclection.
In the existing code we track the current data device then update it to the newest data device
when the source inside a data device changes.
If we store the active data source inside Seat instead of the device everything becomes
somewhat simpler and safer.
An entire unit test vanishes as that case of an externally set DataDevice with no source
can no longer happen.
There's also a lot of duplication that's been merged in this patch so we have one path.
There are some technical behavioural changes in particular we do cleanup when the
source vanishes rather than the data device, but if anything that seems safer and more correct.
It's a precursor for introducing an abstraction class round the source without needing to meddle
with too much code.