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
I'm not sure what these remarks explain to a user. There's not enough information here for anyone to understand why you bothered to comment because it doesn't say *why*