[SPARK-3469] Call all TaskCompletionListeners even if some fail

This is necessary because we rely on this callback interface to clean resources up. The old behavior would lead to resource leaks.

Note that this also changes the fault semantics of TaskCompletionListener.
Previously failures in TaskCompletionListeners would result in the task
being reported as failed. With this change, tasks won't be reported as failed
simply because the execution of TaskCompletionListener fails.