If at a coercion site an expression e has type T but type U was
expected, and T: HasPlace and T::Target: PlaceCoerce<T>, then we replace
e with @T::Target::Output **e and repeat this until types match and
raise an error otherwise.
If X: PlaceWrap and X::Target has a field field, then X itself
acquires a virtual field named field as well. That field has type <X as PlaceWrap<proj_ty!(X::Target.field)>>::WrappedProj::Target, and
WrappedProj is the projection used when we refer to that field.