Use asyncio.Semaphore; fixed hub.wait_async not cancelling future issue on timeout