Feature gate macro arguments

Uses the same approach as https://github.com/rust-lang/rust/pull/17286 (and
subsequent changes making it more correct), where the visitor will skip any
pieces of the AST that are from "foreign code", where the spans don't line up,
indicating that that piece of code is due to a macro expansion.

If this breaks your code, read the error message to determine which feature
gate you should add to your crate.

Closes #18102

[breaking-change]
I think this is normally formatted currently with the `->` aligned with the opening `(` of the function, and the `where` clause tabbed over by 1 with the opening brace on the next line.