Added INTERNAL notion of "final" variables because...

...otherwise you could do:
System.out = null;
System = null;
Handle final variables correctly and added tests