check crate is responsible for ensuring that an AST expression is actually a valid
program. This currently consits of three larger parts, typechecking, kindchecking and renaming.
If an AST passes the checks in
Typecheck::typecheck_expr (which runs all of theses checks
the expression is expected to compile succesfully (if it does not it should be considered an
internal compiler error.
The main typechecking interface which is responsible for typechecking expressions, patterns,
etc. Only checks which need to be aware of expressions are handled here the actual unifying and
checking of types are done in the