Change `ViewDataDictionary` copy constructor to ensure `ModelMetadata` is never that for `object`

- `ViewDataDictionary<TModel>.ModelMetadata` was for `object` after base
 copy constructor got value from `ViewDataDictionary<object>`
- problem led to #1426 symptoms
- with copy constructor leaving `base.ModelMetadata==null` more often,
 `ViewDataDictionary<TModel>.ModelMetadata` usually tracks `TModel` if
 `Model==null`

nit:
- fix existing comment in main `ViewDataDictionary` copy constructor
- add some `<remarks/>` to the four `ViewDataDictionary` copy constructors

plus tests
could do but have not received a request for a functional test of this particular area.  basically I'm just checking in the minimum necessary to _manually_ verify the scenario.