flush completes the wait immediately: it removes the listener, clears the
fallback timer and invokes onDone (once - later calls and late events are
no-ops). cancel tears the wait down silently: listener and timer go away
and onDone never fires. Call cancel from a destroy hook so a directive
torn down mid-transition does not receive a late onDone from the fallback
timer.