Why all these extensions?
I could've cheated a bit and gotten by without the last four:
the function typecheck below is partial anyway.
If we permit one sort of errors (when the deserialized term is
ill-typed), we may as well permit another sort of errors
(a closed-looking term turns out open), even if the
latter sort of error can't arise if our typecheck function is correct.
due to the desire to let GHC check some correctness properties
I wanted to avoid unnecessary errors and let GHC see the
correctness of my code to a larger extent