major test refactor, fixed for loop bugs

tests will now be done by verifying 2 properties about the resulting
code: if they are tacified, and if the resulting context of their
execution is at least the same as the resulting context of the original
codes execution. If the tests are written in the right way it allows for
a much more flexible framework due to the way we can define what tacify
will mean for a piece of code.