SubscriptionSource
What a subscription reads: the aggregates (by name) of context whose state events it receives, and the event names it is limited to. Empty aggregates or events mean no limit; a null context means the handler's state type is not an aggregate of the module that declares it.
context may be another context than the subscription's (@OnEvent(aggregates = ["ctx.agg"])): the subscription then reads that context's published state events (PublishedManifest) instead of the log.
nullableState says the handler takes a null state, StateEvent<S?> or StateEvent<*>: only such a handler may read a stream published without the state (PublishedManifest.includeState = false).
eventSchemas is a fragment's alone: the schemas of another context's events a handler takes by type (StateTypedEvent<V, E>) without naming their aggregate. The service's Manifest finds the context and the aggregates from the peer contracts on its class path (PeerSources) and holds those instead.
Fields may be added: pass the constructor's arguments by name.