Move WebRtc logic to WebRtcManager

- This is intended to reduce the quantity of useEffect, which causes "cascading" updates. The end goal is to reintroduce StrictMode (soon), and hopefully to make the code easier to understand.
- Some logic to support calls with more than one peer has been added. This is intended to test the new architecture will be scalable with React hooks.

Change-Id: Id76c4061b06a759f55957a48a1283d46afc3f73a
diff --git a/client/src/utils/utils.ts b/client/src/utils/utils.ts
index 794fb92..53b8a02 100644
--- a/client/src/utils/utils.ts
+++ b/client/src/utils/utils.ts
@@ -43,3 +43,5 @@
 export const isRequired = <T>(obj: Partial<T>): obj is T => {
   return Object.values(obj).every((v) => v !== undefined);
 };
+
+export type Listener = () => void;