Resiliency: Add logging/safety when deleting files

File.delete() is not great as it just returns a boolean if it succeeds or fails.

Instead we can use Files.delete/Files.deleteIfExists, which throws a real exception when it fails (e.g. DirectoryNotEmptyException, Access Denied, etc)

Brings in helpers from lucene (temporarily as XIOUtils):
* deleteFilesIfExist(File...): removes all the files, throwing the first exception with suppressions for other exceptions, but always attempts to remove all files
* deleteFilesIgnoringExceptions(File...): removes all files, suppressing all exceptions. good for when handling other exceptions
* rm(File...): recursive removal of all files, on any failure throws exception that contains each file name and the exception it hit.

Bans File.delete() with forbidden APIs.

This is also an opportunity to review all places in the codebase where we delete files, since they are all touched in this PR.
we could, but I worry this would mostly defeat the benefit of this patch. 

One main reason Files.delete is better than File.delete, because instead of returning a boolean value on failure (which is easily ignored), it forces you to think about what should happen on IOException, since its a checked exception. 

If we make an "easy-to-use" utility method that "shoves it under the rug", we gain nothing.
So I think call sites should deal with this on a case-by-case basis. 

Deleting files is serious business: I don't think we need a lot of abstractions and ease-of-use around it?