(core) - Make Client more forgiving by sharing result sources that emit cached results (#1515)
* Replace operation semaphore with shared behavior source
Replace the client's counting of active operations with a
single, shared operation result source in a Map. This achieves
the same semaphore behaviour but replaces it with a binary
semaphore-like cache, where the cached source remembers the
last active result.
* Prevent emitting cached result if a new result emitted first
* Reuse client.query() in client.readQuery()
* Add tests for shared source behaviour
* Abstract replay logic in Client
* Add test for shared subscription behaviour
* Fix linting issues
authored by