Allow linting by invoking rustc on the crate root

When not using cargo, this allows the linting of files in the module hierarchy that do not compile in isolation.
For example, invoking rustc on a module that `use`s something with an absolute path from the crate root, will fail.
Instead of invoking rustc on a single file, we do so on the crate root so that all imports are resolved and then
filter the errors in the current file (same as when using Cargo.toml).

This behavior can be enabled by using the `use-crate-root` option. By default, the crate root is considered to be
`main.rs` or `lib.rs`. This can be overridden by using the `crate-root` option. If no crate root is found, the
current file is linted instead.