* fix(datasource/crate): tolerate null metadata fields
crates.io returns `null` for unset crate metadata fields. `z.string().optional()`
rejects `null`, so a single null field (e.g. `documentation` on the `sentry` crate)
failed the whole metadata parse and discarded the valid `repository`, leaving
`sourceUrl` unset and breaking monorepo grouping. Use `.nullish()` so null fields
are tolerated.
* datasource/crate: Use `Nullish()` for metadata
* datasource/crate: Use `sentry` for null metadata test
* datasource/crate: Use `DeepNullish()` for metadata
Moves datasource, manager, platform and versioning code from lib/ into new lib/modules/
BREAKING CHANGE: External tools must update paths to datasource, manager, platform and versioning