d27dd69bfc
Smoke test failed: "A Timer is still pending even after the widget tree was disposed." Both workers fired their initial-delay Timer via `Timer(duration, _sweep)` and stored only the periodic ticker in the cancellable field — the one-shot Timer leaked past dispose and tripped the test framework's invariant check. Track both as _initialTimer + _intervalTimer; cancel both in dispose(). Behavior is unchanged in production (ref.onDispose only fires on process death normally); this is purely a test-harness fix.