NearbyLoom
Loom implementation backed by Google Nearby Connections.
All logic is GMS-free and lives in commonMain. The real binding that imports play-services-nearby is supplied by androidMain at construction time.
Concurrency and virtual-time correctness
Background coroutines are launched into a scope derived from the caller's coroutine context at open()/join() time: CoroutineScope(currentCoroutineContext() + SupervisorJob()). This means background work inherits the test dispatcher (and therefore runTest's virtual clock) when tests call these methods. The scope is stored and cancelled in NearbySeam.close so no coroutines leak between tests. There is no long-lived process-global scope.
Single-loom symmetric topology
One NearbyLoom handles both the advertiser role (open) and the discoverer role (join) through the same NearbyApi. Both seams share a single sharedPeers StateFlow. This matches the us.tractat.kuilt.core.InMemoryLoom pattern and lets the conformance suite run a "one loom, one host, one joiner" scenario.
Parameters
NearbyApi to use (real GMS or fake for tests).
Nearby Connections service ID. Must match on both devices.
Handshake timeout forwarded to ConnectStateMachine.
Per-chunk payload cap forwarded to ChunkCodec.