Support NFI boxed types besides boxed-datum

This allows the parameter types and return types of NFI functions to
specify the exact boxed type they're expecting. This has a few
advantages:

- The standard library doesn't need to perform its own type assertions
  on parameters

- The compiler can elide type assertions when it knows the type of the
  value being passed to the native function

- The compiler has more type information about the values being returned
  from native functions