Less async; realised that we can't rely on timer disposal to ensure no work is active unless we consume the timer thread while waiting.