Some updates for optimization.
1. For Map and Reduce, they call fetch_base_tile() instead of fetch() if the
   argument is Broacast. This function fetch the corresponding tile in the
   base array. It means these tiles are not broadcated immediately.
2. Current optimization sequence eliminates the chance to do parakeet for
   those MapExprs which have been fused into ReduceExprs. So we should do
   ReduceMapFusion last.
3. We should visit children inside ParakeetGeneration.visit_MapExpr().
   Otherwise we lose the chance to do parakeet for some MapExprs.
4. If all deps for a MapExpr are not FnCallExpr, it is not worth to do
   parakeet for it. (According to experiments, it usually get worse
   results)
Visiting an NDArray shouldn't create a new expression id.
Prettier string representations for most nodes.

The default debug string is useful for... debugging.

It's a little too much information for most purposes.  Change
the default representation to be a bit prettier.
Add missing method.
Don't show local input keys in pretty strings.
Merge pull request #128 from spartan-array/pretty-print

Prettier string representations for most nodes.
Changes according to the  code review.
Changes according to the code review.
Optimization bugs fixed
Change from code review
Merge branch 'master' into fix-ndarray

Conflicts:
	spartan/expr/ndarray.py
Merge branch 'master' into optimization

Conflicts:
	spartan/expr/base.py
Typo
Fix bug from previous merge.
Merge pull request #136 from fegin/optimization

Some updates for optimization.
Merge pull request #139 from MaggieQi/master

add sort into expr
Merge pull request #142 from fegin/optimization

Optimization bugs fixed
Merge branch 'master' of github.com:spartan-array/spartan into ec2_test
modify app to support optimization
Merge branch 'ec2_test' of https://github.com/MaggieQi/spartan into ec2_test