Implement the event primitives service workers need for lifecycle and fetch interception.
Scope:
- Add ExtendableEvent with waitUntil() promise tracking and rejection handling.
- Add FetchEvent with request, clientId/resultingClientId placeholders, respondWith(), preloadResponse placeholder, and handled promise semantics.
- Enforce single respondWith() call, call timing rules, and timeout/error propagation appropriate for the existing event loop.
- Integrate these events with ServiceWorkerGlobalScope dispatch.
Acceptance criteria:
- Unit tests cover waitUntil fulfillment, rejection, multiple promises, timeout/error paths, and deterministic completion.
- Tests cover respondWith fulfillment, rejection, duplicate calls, and late-call errors.
- Lifecycle activation waits for accepted waitUntil() promises before state changes.