Add support for block assignments and invocations
Add support for block assignments and invocations

- Blocks create new scope
- Block name is added to scope as a function that internally
  calls traverse on the block node. So technically, the AST
  for the block is run only when the block is called.
  To aid this, __params__ property is attached to the new scope
  that is used when the block runs.
  This property is an array of param names, for e.g., if you
  have the following block:
  `let add x y = { x + y; }`
  then __params__ = ['x', 'y'] and the blockNode is a
  BinaryOperatorExpression.
  __params__ is used to map `...args` during runtime to param
  names in the newScope. This is necessary because when the block
  is invoked, it is invoked with the newScope (that has old scope
  as parent). invocationExpressionHandler will query the scope for
  the values of params (i.e., value of x, y). Therefore, we must
  prepare newScope beforehand and make values for 'x' and 'y'
  available on it. That is what __params__ lets me do.
- BinaryOperatorExpressions are now handled.
  Arg1 and arg2 are traversed recursively and based on type of op,
  one of the paths from the switch case in
  binaryOperatorExpressionHandler is chosen.
- Traverse has the following two changes
  + the forEach loop returns the value of the last expression it
    evals. This technically means that the result of the last
    line in a block or program is returned.
  + if the node.val is just an object, return the value of
    traversing it too.

zeusdeux/moks