- Redesign interface, pushing certain checks out of type classes into top-level
generic function type signature. It means busier top-level types and more code
for wrapping them, but it allows for more flexibility and cleans up
implementation. (And the busyness simply makes explicit the implicit checks
that were being done before.)