More general form of AssignOps using source transformation

I've changed the way we compile AssignOp by having it use the same operation types as Binop and doing a source rewrite from lvalue op= expr to lvalue = lvalue op expr. This way, we don't have to have special logic for complex numbers and just re-use the work we've already done on Binop.