クレートとモジュールを整理するとこんな感じ
どこか間違ってるかもしれない

・Rustのクレートは1つの仮想的なソースファイル(以下ルートファイル)から作られる
(rustcはインプットで1つのrsファイルだけを受け取ってクレート(bin, rlib, etc.)を出力する)

・ルートファイルは内部に階層的なモジュール(mod foo {...})を持つことができる

・ルートファイルのモジュール"mod foo {...}"は"mod foo;"とすることでモジュール本体を別ファイルに切り出すことができる
 別ファイルのパスはそのモジュールの階層と名前によってルートファイルから相対的に決定される(ここが分かりにくい)
 また、#[path="..."]で場所を直接指定することもできる
 参考:https://doc.rust-lang.org/stable/reference/items/modules.html

・ルートファイルは慣習的に"main.rs"(実行用)、"lib.rs"(ライブラリ用)が使われる
 (Cargo.tomlのpathで指定可能)
 テスト実行用のルートファイルは見えないところで勝手に作成される

ルートファイルとかオプションを切り替えることで同じファイル群から
複数のクレート(ライブラリ、ツール、テスト、etc.)を出力できるのがパッケージかな
別に複数じゃなくてもいいけど