Implement a multithreaded task executor with semaphores | SoFi Interview Question