Allow limiting concurrency when using concurrent executor
Avoid using semaphore if there is no concurrency limit (#22) Avoid paying the cost of calling the semaphore if no limit is set.
Avoid using semaphore if there is no concurrency limit (#22) Avoid paying the cost of calling the semaphore if no limit is set.