Remove the lock when connecting

Using an atomic compare and swap we can determine whether the caller should connect to source signal.
Use a serial disposable created at initialisation time so that connection is non blocking and connection can always return a disposable to callers, even if we aren’t connected yet.
Simplify the race condition test

This is the test from @kastiglione with the addition of a semaphore. Using the semaphore we ensure that the disposable is nil because of the bug we’re testing rather than nil because the block enqueued to the scheduler hasn’t run yet.