Support prelude functions in the type checker and the interpreter.
checkDef must be guarded with newBlock/exitBlock.

Otherwise ids in different functions conflict.
Don't shadow the existing binding.

This binding for `k' shadows the existing binding
Don't shadow the existing binding.

This binding for `vars' shadows the existing binding
Don't shadow the existing binding.

This binding for `id' shadows the existing binding
Fix non-exhaustive pattern matches.

Throw a compiler error if unreachable patterns are matched.
Remove unused bindings.
Don't shadow the existing binding.

argId -> aId, argType -> aType to avoid name conflicts with CPP.AST.
Mark unreachable code in the compiler as InternalCompilerError.

Change CompileError to an algebraic data type with two data constructors and
use InternalCompilerError to mark unreachable code in the compiler.

data CompileError =
    InternalCompilerError
  | CompileError String deriving (Eq)
Add a CPP code example: fac(n)