Change the task interface such that starting a task without blocking the caller should return a future_t object, allowing blocking on that task latter and a more intuitive interface to retrieve the return values than task:result().
Perhaps change it from a parameter in __call to a separate function to start the task. Or maybe have both.