You can have as many ZSTs as you want, but only one non-ZST. Incidentally, Sized is implied in that position.
There's no standard trait bound for being a ZST or not. You could maybe hack one together with const generics but I don't think there's a way to get the compiler to recognize it for e.g. the #[repr(transparent)] requirements.
No, Sized implies that the size is known at compile time. ZSTs are sized (and their size is 0). DSTs (Dynamically Sized Types) like str and [T] and dyn Trait are not Sized because they can have many different sizes, varying at runtime.
The Sized bound is implied on most generic type parameter positions. You can remove the bound by using <T: ?Sized>. The main place it is not implied is for the implementer of a trait; that is,
trait Trait {}
has no Sized supertrait bound; non-Sized types can implement Trait.