Task level parallelism

Introduced a new class that caters for task level parallelism. Now,
each task is handled by a different worker when we have more workers
than tasks for each job.