The defun helper takes a type signature and a function and makes a typed version. Because we can.
Does not currently test check failures, which makes it sort of not as useful as you'd think.