Earlier quoted context omitted.
What is broken-by-design about the api?
Fundamentally, an async API is either data-oriented (Futures/Promises: tell me what data this task produced) or job-oriented (Threads: tell me when this task is done). You can think of it like functions vs subroutines. Since you typically care about the data produced by the task, threads require you to sort out your own backchannel for communicating this data back (such as: a channel, a mutexed variable, or something…
[1]: http://cr.openjdk.java.net/~rpressler/loom/loom/sol1_part2.h...