A programming language is a formal language rather than any natural language, and jargon whenever it matches natural language. As it is read and written by humans, whose first (and often second and third) language is a natural one, it should use natural language words when it aids understanding by those feeble humans, and conversely it should not use natural language words when it misleads humans.
But it does not need to slavishly adhere to Strunk & White or even English grammar. The program as a whole is not an English text. Any keyword taking after an English word is only taking after it, i.e., it indicates a formal-language-thingy that is intuitively close enough to a natural-language-thingy that using the same word is a useful mnemonic.
“Trait” captures the intuition about what a trait is. “Iterator” captures the intuition about what it means to have a next method. That the two clash grammatically when transported back into natural language land is a bit unfortunate, but completely irrelevant. In fact, it may even be useful, since it distinguishes the jargon from normal English. Furthermore, the concise names (no ubiquitous -able suffix) have their own readability advantages.
Finally, the English texts outside of the program proper (i.e. the technical writing and speech of Rustaceans) has no trouble being grammatically correct. When referring to the trait itself, the name is a proper name and thus above all criticism. When reading a bound like T: Iterator or T: Extend, we can unpack the trait name (T is an iterator, T can be extended) or we can be clinical and say “T implements Extend”.