Various COFFEE improvements

Three major points are addressed:
- The code has been refactored and now is much more clean. I like the way it is, although something else could be done in the future. You'll see lots of changes if you compare the code, but actually most of them are just about moving things around and renaming methods/variables etc. 
- Fix a few nasty bugs when symbolically executing the kernel to track the propagation of zeros
- Improves code motion by also recognizing the presence of duplicates in the hoisted code (this was done also previously, but not in the systematic way we do it now)
If it's a 0-form, there are no test/trial functions, so there are no zeros to remove for them. 
I agree with you we could do something for vector-valued coefficients, if that's what you meant. However, at the moment, COFFEE "ignores" zero-forms (i.e. it just unparses the AST into C code, by noting there are no test/trial functions loops) based on the assumption that they are irrelevant for performance. This doesn't mean that COFFEE *cannot* do anything for them; theoretically it could, it would be just a matter of changing some lines and debugging some corner cases