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 convention I tried to set for this (see fold.rs) is:
```rust
            item.and_then(|ast::Item { attrs, span, node, .. }| match node {
                ast::ItemMod(m) => (m, attrs, span),
                _ => panic!("fold converted a module to not a module"),
            })
```