The standard semaphore concept, with an async API.
Create a simple counting semaphore,
create initial_value is the inital value of the
semaphore. Callers to
decr will wait until the value is positive.
Get the current value of the semaphore
Increment the semaphore and if there are jobs sleeping on
decr wakeup one of them.