(feat) Sound multi-dispatch for Assoc

This relies on an assumption that  the type `(K, V)` will have a different `TypeId` from `(K, V2)`. This will reduce the available set of `TypeId`s available, but I doubt that's an issue in practice?

Closes #15.