Support immediate event registration (#829)
You can now register events as soon as the base Endpoint constructor runs.
This works by moving the canonical location of these observables from the behavior backing to the endpoint. However
the events on the behaviors need to have have a different lifespan for observers so e.g. you can register an observer
in the initializer and have it unregister when the endpoint is deinitialized. So we use a specialized Observable for
the behavior that proxies to the canonical observable on the endpoint.
Also adds tests for observable emits on the endpoint and behaviors.
Fixes a few bugs:
- Previously adding event listeners outside of behaviors would have ended up in them being deregistered if the endpoint
is deinitialized (e.g. factory reset)
- Behaviors required on one endpoint instance were leaked to other instances that shared the same EndpointType
- Observables weren't properly disposed of in a few contexts, not sure if it mattered before but it does now
- Added some "await usings" to tests to clean up resources