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 
Much rather we change test code to use the ctor this calls into than making an internal ctor that is visible across multiple assemblies. I'm fine doing this in a follow up PR if it results in far too many test code changes