I think most of the surprise comes from the external crate problem, so most of it will be fixed if you don't mount external crates at the root, but manage them through [cratename]
instead.
Especially, if you disallow stuff like fn mention_write<T>() where T: std::io::Write {}
and require it to be written like in submodules to the root, aka with [std]::io::Write
, I think most of the confusion will be gone.
AFAIK, currently, the only thing that is technically different in the crate root from other places of the crate is that std or core get auto-mounted at the root. In theory, you can declare extern crate in submodules as well so its the same except for std. However, popular practice is to put the extern crate declarations most times into the root, making the root practically different in this regard as well.
So the only difference you could think that remains where the crate root is different from one of its submodules is that it can use its modules with seemingly absolute paths (no need for :: prefixing) but that property is IMO already the case for any module and its submodules, and there is also no practical difference arising from this; if you want to split up the crate root, maybe you want to split up the first level of modules into a second level as well at a later point.