Fix failure case for parallel primitives

Previous code was supposed to terminate the calling thread if
a primitive operation was unsupported, but led to a complete
failure instead. This patch fixes it, and also tries to return
closures which can at least be evaluated otherwise.