[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 is confusing because elsewhere when we say `executors` we mean Spark executors. I think we should call this something else `directoryCleaner` or something (and update the comment)