I am curious why vibe.d uses its own concurrency system instead of just using std.parallelism.TaskPool/Task for example?

What I would want is a system that maps N tasks onto M threads. Each task represents a unit of work and each task can also spawn tasks and wait on its result. But if one task has to wait on another task it should be rescheduled and should not block a thread.

It seems that std.parallelism does all that just fine. Is there anything inherently bad with std.parallelism?