Updated main.rs to work with lambda lifting, etc
Fixes for unbound lambdas

Unbound lambdas are lambdas that are not found directly on the right side of a let binding. Since the compiler cannot handle these they are translated to core as let bindings which directly loads the bound lambda which causes the lambda lifter to lift them out of the expression entirely. The compiler was changed to fail if a lambda is found anywhere else than directly in the binding
Fix for bindings that were not in the outermost expression

Every time an argument is encountered the stack will increased until the application is completely done which need to be taken into account
Avoid generating unnecessary let's when abstracting

If a binding has no free variables nothing needs to be done about it so avoid some inefficiency by recognizing this case specially
Fix for let expressions that were not the outermost expression
Added renamer.rs which is renamer supposed to work before typechecking
Added renaming step before typechecking, tests failing but it compiles
Fixed renaming of constructor patterns creating a new name instead of doing a lookup
Fixed compilation errors in the typecheck tests, made Constructors all have uid=0
Overhauled the handling of generic variables

Bindings such as 'showInt' would have the type for 'i' be treated as generic after typechecking the let bindings body since the type for 'i' would be unified against the generic from 'i2'. With the new system this should no longer happen.

showInt :: Int -> [Char]
showInt i =
    let
        i2 = i `rem` 10
    in showInt (i `rem` 7)
Applications should not get a parse error on chars and strings
Added PrimitiveFunction as constructor in the VM

PrimitiveFunction represents a function that is not possible to implement in haskell and is thus represented as a rust function
Removed duplication in Unwind instruction
Made the compiler use the primitives() build the lookup table
Do a deepseq before printing out the error message in the error primitive
Fix the for running an expression on the command line running in the wrong assembly
Changed nodes in the VM to hold mutable values (prepare for overwriting after using Eval)
Eval now updates overwrites the value after it has evaluated

This is to prevent duplicated work that would otherwise come from evaluating "thunks" or function applications multiple times.

test y =
    let
        x = 2 + y
    in x * x

In this function the x value would be stored as a function application which would be evaluated twice before but by updating the value after performing the first Eval instruction, the second time x is requested the value would already be there
Implemented first attempt of the IO monad

It is based on continuation passing style and is probably full of bugs but readFile works with the proper type
Added putStrLn