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
note: `ModelMetadata` might occasionally be for a different type than a derived `ViewDataDictionary<TModel>` should "naturally" return when `Model==null` but `Model==null && ModelMetadata.ModelType != TModel` symptoms aren't major enough to revamp the tests in the release branch.