SPARK-2565. Update ShuffleReadMetrics as blocks are fetched

by "users" I mean internal spark code that instruments this. I think it is counter intuitive to make something a var (and to expose it as a var publicly) but actually there is no intended use where someone modifies this var. There is a corner case here where we deserialize an object form JSON - so I'd propose we create a very narrow interface to deal with that case - a setter with clear documentation. I really think object deserialization is a special case here... if something is mutable for the purpose of deserializing - IMO - that's quite different than making it mutable outright for normal program execution.