Change `VecMap`'s iterators to use wrapper structs instead of typedefs.

Using a type alias for iterator implementations is fragile since this
exposes the implementation to users of the iterator, and any changes
could break existing code.

This commit changes the iterators of `VecMap` to use
proper new types, rather than type aliases.  However, since it is
fair-game to treat a type-alias as the aliased type, this is a:

[breaking-change].
Merge pull request #19720 from csouth3/vecmap-newtypes

Change `VecMap`'s iterators to use wrapper structs instead of typedefs.

Reviewed-by: Gankro, Gankro