Implemented encode function for bindings in instances
Added constraints to the TypeEnvironment
Fixes missed when rebasing

Mainly fixing the dynamic borrow checking from using Rc pointers.
Added typechecking for class constraints
Added a test to check that constraints are propagated to the callers signature
Implemented instance functions for when the type are already known

For instance in the below binding the type for (+) :: Num a => a -> a -> a would be known as a == Int so the function could be directly loaded with no indirection

add2 :: Int -> Int
add2 x = 2 + x
Implemented the rest of the cases for functions with constraints

Should be able to handle "all" types of calls to functions with constraints

- Fixed the compilation of binary primitives, arguments were in the wrong order
Functions with constraints are now working in the general case

Needs more tests though