[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.
Dynamic allocation, at the very least in the sense of adding executors is still useful without the external shuffle service.  I hadn't noticed before that dynamic allocation will kill containers with blocks on them.  Even with the external shuffle service, isn't this a problem for cached blocks?  Would you be opposed to me adding a mode that avoids this?