Typescript sometimes decides to "compile out" prototype chains like this
we have to *enforce* that these classes have the right inheritance,
because we do instanceof checks to determine what kind of error was
thrown. We could switch to a tagged union approach, but this seems more stable.