[SPARK-4236] Cleanup removed applications' files in shuffle service

This relies on a hook from whoever is hosting the shuffle service to invoke removeApplication() when the application is completed. Once invoked, we will clean up all the executors' shuffle directories we know about.
This form was actually copied from Utils, perhaps intended to make the side-effecty delete() more visually distinct from the existence check. I think it would be most clear if we just made a "deleted" intermediate value and then used the form you suggest.