I know this is parallel to the original code, but any downsides to just replacing this with an `AsyncSemaphore` and  `FuturePool`?