Fixes deserialization of collections for get-only properties

For properties without setter, get first and use the returned instance for filling
from serialization. Creating a new instance and replacing using set is not
sufficient for deserialization of collections.

It is not required to have setter to serialize dictionnaries.
Deserialization of dictionnaries shall use Add methods, not Items setter
Improves exceptions usage
Fixes IsDictionary and IsEnumerable
Fixes GetCollectionElementType
Conforms to coding guidelines