Add Properties!

This commit adds all of the changes made over the last few weeks which
were necessary for adding properties (as well as some functionality
changes and bug fixes).

Properties are a way of defining a backing variable and methods for
accessing it with a simple concise syntax. A property can have a getter,
a setter, and a constructor, which can all have customised behaviour.
They can all access an exclusive property backing variable (if the
property is not declared as unbacked), which cannot be accessed from
anywhere else. It is referred to by using the name of the property
without prefacing it with "this.".

Properties can also be overridden. To override a property, new
implementations of any of its methods (getter, setter, constructor) may
be provided, and default implementations are provided if they are not.

In terms of the compiler's structure, this changes the way member
variables and functions are represented. Before, they were just
non-static fields and non-static methods; now, they are stored as
MemberVariables and MemberFunctions, which know their own index in their
containing object.

Aside from adding properties, the main change is the keyword used to
define a constructor. Rather than "this", it is now "constructor". While
it is slightly longer, it illustrates the meaning much better.
It also makes constructors in general much more easily recognisable,
since the "constructor" keyword is also used for property constructors.