rustc: Process #[cfg]/#[cfg_attr] on crates

This commit implements processing these two attributes at the crate level as
well as at the item level. When #[cfg] is applied at the crate level, then the
entire crate will be omitted if the cfg doesn't match. The #[cfg_attr] attribute
is processed as usual in that the attribute is included or not depending on
whether the cfg matches.

This was spurred on by motivations of #18585 where #[cfg_attr] annotations will
be applied at the crate-level.

cc #18585
The `item` has type `P<T>` and currently `P<T>` doesn't support moving out, but the `and_then` closure consumes the pointer and gets the contents by value, so I figured I'd take it out via that.

I could also just add `.move()` :)