Implement async semaphore