Rewrite variables to better understand inheritance

Variables were fickle in the presence of inheritance. They are now
hoisted and maintain a super reference in the same way as methods, but
raise an undefined error if they are touched in any way until the
lowest-most field has actually been encountered in the initialisation
code, including assignment. The latter case is achieved by hot-swapping
the variable's pattern from one that raises the desired error to the
real pattern.

Searching for definitions in scope now searches in self before searching
locally when it reaches the scope where self is defined. Searching in
self can be entirely disabled, however.