modernize smallintmap module

This makes it a proper owned data structure without an @ box and a mutable field (from DVec), and implements the core::container::Map trait.

The old module is still around as `oldsmallintmap.rs` and migrating over to the new module seems like it will involve dealing with switching to explicit self and getting rid of mutable fields in the librustc code (at least without boxing it in @ again). I gave it a try but it turned into a bigger mess than I felt like dealing with today.

Closes #4693 and #2347, and another bug can be opened about migrating away from the old module.