My meta-thought here is that it all sounds ok-ish, but that I wish every one of the things would go just a tiny bit futher.
For example, rather than having some traits return the non-zero type and some return the could-be-zero type, just have a ranged type so it always have the correct size (like I describe in Non-negative integer types - #20 by scottmcm).
And rather than adding a suffix for non-zero, extend {integer} to be something usable by more types -- so NonZeroU32, but also num::BitUInt and such. Using some sort of "const trait" support, so that the compiler can run the parsing as a const, so if it panics it's a compilation error.
While it's even longer, I'll toss in const { NonZeroU32::new(123).unwrap() } -- that way you'll get a compilation error if you passed in 0, so it's guaranteed as fast as the unsafe version while still being safe.
This sounds like a partial version of what I described