SPARK-3172 and SPARK-3577

The posted patch addresses both SPARK-3172 and SPARK-3577.  It renames ShuffleWriteMetrics to WriteMetrics and uses it for tracking all three of shuffle write, spilling on the fetch side, and spilling on the write side (which only occurs during sort-based shuffle).

I'll fix and add tests if people think restructuring the metrics in this way makes sense.

I'm a little unsure about the name shuffleReadSpillMetrics, as spilling happens during aggregation, not read, but I had trouble coming up with something better.

I'm also unsure on what the most useful columns would be to display in the UI - I remember some pushback on adding new columns.  Ultimately these metrics will be most helpful if they can inform users whether and how much they need to increase the number of partitions / increase spark.shuffle.memoryFraction.  Reporting spill time informs users whether spilling is a significant impacting performance.  Reporting memory size can help with understanding how much needs to be done to avoid spilling.

@pwendell any thoughts on this?