docs: @Override public boolean onExceptionalCompletion(Throwable ex, CountedCompleter caller){
        Futures fs = new Futures();
        if( _job != null ) {
          UKV.remove(_job.destination_key,fs);
          UKV.remove(_job._progress,fs);
          // Find & remove all partially-built output vecs & chunks
          if( _job._mfpt != null ) _job._mfpt.onExceptionCleanup(fs);
        }
        // Assume the input is corrupt - or already partially deleted after
        // parsing.  Nuke it all - no partial Vecs lying around.
        for( Key k : _keys ) UKV.remove(k,fs);
        fs.blockForPending();
        // As soon as the job is canceled, threads blocking on the job will
        // wake up.  Better have all cleanup done first!
        if( _job != null ) _job.cancel(ex);
        return true;
      }