Use ManualResetEvents instead of WaitAny for Bus.Shutdown of tasks

- Events used instead of Task.WaitAny to avoid a race condition and
ensure tasks are stopped even when Shutdown is called immediately after
Bus.Start
- ManualResetEvents used instead of AutoResetEvents so Bus.Shutdown
doesn't freeze when called more than once in a row (eg one call due to
exception, another due to closing the service)
- Interlocked.Exchange used so multiple Shutdown calls Stop tasks only
once