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