Introduce lazy evaluation to Main (not complete)

Cannot define recursive function correctly
Call by name
Add enum_from_to and notation [x..y]
Fix bugs in showing list
showValueLazy does not evaluate 11th element in list
(ex. evaluating "append [1..10] [head []]" does not raise error)
Introduce monadic evaluation to EvalLazy

Call-by-need is NOT implemented
Correctness is NOT proved
Maybe contains some bugs
Implement graph reduction

When variables are first evaluated,
 eval changes the bindings of the variables (from thunk to the value it was
  evaluated into)
Bindings of variables in letrec expr are not changed
Change evalThunk, EV

EV becomes less polymorphic (EV (after) = EV IO (before))
evalThunk destructively changes the content of Thunk(IORef ThunkData)
Add #seq operator and some strict functions (*_s)

Introduce #seq operator (a #seq b evaluates a, then evaluates b)
foldl_s evaluates strictly, keeping thunk from being too large
[Error] The type of times_s is not correctly inferred(actual:int->(a->b)->a->a, expected:int->(a->a)->a->a)
Fix bugs in type inference (TypeInf.hs)
Remove debug prints