Module system cleanup

Remove a few unnecessary restrictions and inconsistencies in the module system, namely:

- Lift the hard ordering restriction between `extern crate`, `use` and other items.
- Allow `pub extern crate` as opposed to only private ones.
- Allow `extern crate` in blocks/functions, and not just in modules.
- Optionally keep the order restriction as convention with a warn-per-default lint