Future-prove `collections::VecMap`

Since `VecMap` might want to have key type parameter at some point, add a key
type parameter now, so that code running today will still run when actual
generalization of the key is added.

The trait `VecMapKey` should really be private, but this is blocked by the fact
that you cannot export a struct, function or trait implementation with one of
the type parameters being bound by a private trait.
So this is basically CLike from EnumSet, right? Do we then want `from_uint` to be unsafe so that the `K -> uint` mapping can be injective without the implementer having to check? 

Also do we really want to be as narrow as VecMapKey? coercing to/from an index seems like moderately generalizable behaviour vis-a-vis collections.