Turn `extern crate` and `use` into first-class items.

This implements RFC PR 385. Closes #18219.

**NOTE**: this is a **work in progress**, not all tests pass yet. oh and I've almost forgotten about rustdoc :P.
They're duplicated in the item checking path, though they use a slightly different error message.