Fix GC holes in array marshallers in the field scenario (dotnet/coreclr#27562)
* Correctly protect references to objects in manually-managed code called by IL marshalers in the field scenarios. Use RuntimeHelpers.GetRawData to simplify layout class marshalling.
* Add additional protects for SAFEARRAY marshalling when used in the field scenario.
* Remove dead code.
* Fix possible GC hole from order of argument evaluation.
* Don't clean up fields on a managed object when there's no managed object.
Commit migrated from https://github.com/dotnet/coreclr/commit/
e658b97990f77dca2dba446386e9d8d4d71556e1