refactored into first class Coroutine context object