[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.
This is tricky, because the user may not have set up an external shuffle service when running Spark with dynamic allocation. If we automatically enable this service for them, they will be confused if they see "connection refused" messages when executors try to fetch files from a service that doesn't exist. It's not intuitive to me why enabling a dynamic scaling feature will cause my executors to die because of this.