fix waitall deadlock if any errors occur (#60030)
When errors occur, `waitall` may skip allocating Channel producers,
leading to deadlock in the subsequent loop in the event that the user
asked it to failfast (ironically). This is seen often in the failing of
the threads_exec test ever since the test was added for this call.
Simplify this to just use separate loops for the wait and the return
computation.