[WIP][SPARK-3797] Run external shuffle service in Yarn NM

This creates a new module `network/yarn` that depends on `network/shuffle` recently created in #3001. This PR introduces a custom Yarn auxiliary service that runs the external shuffle service. As of the changes here this shuffle service is required for using dynamic allocation with Spark.

This is still WIP mainly because it doesn't handle security yet. I have tested this on a stable Yarn cluster.
I personally don't see much use of dynamic allocation if you can't both add and remove executors. By default we start the cluster at the max number of executors anyway, so I see little reason to support one but not the other.

Now, if we do support both, then we have to enable external shuffle service because it's basically totally broken if we kill executors without it. Shuffle is different from caching in that it's not only an optimization to keep the shuffle files but also a necessity for correctness. Since shuffling is such a common thing in Spark, I think we should fail the application early before the user realizes his/her job is being re-run over and over again. But yes, I think we left out the caching story so far. My original design is to add a warning or maybe throw an exception if this is enabled and the user tries to cache stuff, and I believe we still need to add that.