I really don't see why user code has to have the same capabilities as the runtime. It looks more like a philosophical request than a practical one.
Yes, some languages do this, but there is (as almost always) a trade of between simplicity and flexibility.
I think Go strikes a very nice spot there.
In go the built in datastructures are very carefully selected, and are extremely useful, while when you need to build your own datastructures is both simple and powerful (you have direct control over memory layout), you just can't build magically generic datastructures, but that always comes at a cost, and Go's interfaces also provides ways to write generic code that are quite powerful.
Generics certainly aren't essential to a language, but once you're used to them it does feel a touch chafing not to have them, as well as it feel a touch strange for them not to be included in a new, statically typed, language. My opinion naturally...