Use block parameter rather than `$1` during `gsub!` so `ActiveSupport::SafeBuffer` values aren't mangled.

Fixes #15064
Require active_support/core_ext/string/output_safety and use html_safe rather than use non-public SafeBuffer API.
Update and add tests in array_ext_test.rb

- Fix `test_to_with_instruct` typo to `test_to_xml_with_instruct`

- Rename `test_to_xml` to `test_to_xml_with_hash_elements` to make test
name more specific.

- Add `test_to_xml_with_non_hash_elements` and
`test_to_xml_with_non_hash_different_type_elements`

  `to_xml` behaves different when containing elements are same and
  different types.

- Add `test_to_xml_with_indent_set`
Update require in `array_ext_test.rb`

Removed `FIMXE` tag to require necessary file but not the whole core_ext
Hash#except is expensive and this is a hotspot, so use a dup + delete
make the module version quack the same as the instance

this way we can stop checking respond_to on every call.
extract route key translation to a method and reuse it
reduce conditionals in url_for
typo: resulution -> resolution [ci skip]
add a test for passing two models to the polymorphic_url method
add a test with three objects
always pass a list to build_named_route_call
remove extract_record since we have extracted the list
stop popping in build_named_route_call
record as a hash is not possible, so rm branch
we always convert this variable to a list, so we can remove the unconversion
only do the Array is_a check once
skip another Array is_a check
pull nil checks up
push all is_a tests up, always pass options to the named route