Your NonCopyable protocol doesn't mean what you thought.
On a protocol, the : ~Copyable constraint does not mean "must be non-copyable". It means "can be non-copyable" (or equivalently, "doesn't need to be copyable").
As a simple proof, you can conform Int to that protocol, despite Int clearly being a copyable type:
Yes, it's an implied constraint. Both for backwards compatibility (so people don't have to run around adding : Copyable everywhere), and because it's usually what people want, anyway. E.g. In Rust you'll find that many of the traits you write end up needing clone.
A bare protocol P {} has an implicit constraint as if it were written protocol P: Copyable {}. Adding ~Copyable merely relaxes that constraint, it does not impose a new "must be non-copyable" constraint.