Rework `ViewDataDictionary` to ensure `ModelMetadata` is never `null` (#1466)

This is the reanimation of #1453, now done against dev.  No significant changes from that PR after I addressed comments there.

See individual commits for details.

/cc @pranavkm @rynowak @yishaigalatzer 
I think something along the lines of 
```C#
var vdd = new ViewDataDictionary(model: new Admin());
var vdd2 = new ViewDataDictionary<Person>(vdd);

Assert.Equal(typeof(Admin), vdd2.ModelMetadata.ModelType);
```

I'm not super sure if this is already covered?