Create basic AssemblyRewriter
Enable remote compilation with intel tools
Avoid identical invariant sub-expressions
Add variable counter to Expr Rewriter
Support hoisting of constant sub-expr
Implement expansion of expressions
Implement a more powerful hoister
Implement distributor of products over sums
Simplify code hoister
Avoid generation of useless symbols
Add ExpressionGraph to track symbols dependencies
Re-structure the expression expander
Add/document networkx dependency
Add/improve comments
Merge pull request #372 from OP2/coffee-expr-rewriter

Coffee Expression Rewriter

The code motioner now can:

* Keep track of hoisted invariant sub-expressions, store them in
temporaries, and re-use them for further calculations. Especially useful
in more complicated forms like those based on hyperelasticity.

* Repeatedly hoist code, expand expressions (e.g. (A+B)*alpha =>
A*alpha + B*alpha), and apply the distributive property. This allows
hoisting even more terms. Motivating example is Burgers.

This introduces a new python dependency: networkx, a
library for handling graphs. This is used by COFFEE to track
dependencies among hoisted symbols.