asyncio-compatible timeout context manager
The context manager is useful in cases when you want to apply timeout
logic around block of code or in cases when asyncio.wait_for() is not
suitable. Also it's much faster than asyncio.wait_for() because timeout
doesn't create a new task.