refactored to look more like what we imaging asyncio will look like