I started to rewrite with time.Tick, but it exposed some ambiguity in the select loop that I thought deserved a more thorough refactor. See comments in the PR description.