Adding basic precedence handling.

nodes.py
* Made all Ops subclasses of a class that intializes it's precedence
  and associativity.  This moves the logic out of the precedence module,
  but I think it makes sense as it makes our ops better encapsulated.
  This equates to less imports, as well as hopefully easier handling of
  implementation changes further on.
* Added get_precedence() function to Ops which returns there precedence,
  assumes currently that all Ops have a field self.precedence with a
  valid value, i.e. no error checking.  Not sure if we should handle
  errors, if we assume that only we are creating Op subclasses then I
  think it's safe to assume that self.precedence should exist.
* Added get_associativity(), similar logic for above.

codegen.py
* Added __visit_with_precedence(self, prev_prec, node).  works by
	calling the normal visit on the node, but then checks if the child
	node is a BinaryOp.  If it is, then compare precedences and adds if
	parantheses are needed.  Currently only called by visit_BinaryOp.

TODO:
* Handle associativity
* Handle UnaryOps
Precedence import no longer necessary
Adding some more test coverage for basic precedence
Adding UnaryOp Precedence and associativity support.

* Used __visit_with_precedence logic for unary ops.  Same
	handling as BinaryOps
* Ensure ties are handled by checking associativity.
* Added more test cases.
Ensure different preferences for Unary vs Binary Add/Sub.
Proper handling of associativity for UnaryOps.
Adding some comments and formatting
Typo fix in comment, clarification on logic
Another typo fix in comment
Merge pull request #2 from leonardt/precedence-handling

Adding basic precedence handling.