Added a WeakReference data type.

The builtin module WeakReference provides three builtins
to work with weak references.

{WeakReference.new X ?WR} creates a new weak ref for X
{WeakReference.is V ?B} tests whether V is a weak ref
{WeakReference.get WR ?Y} deferences the weak ref WR.

During garbage collection, alive weak references do not
keep their underlying value alive. If the value is still
alive through strong references, then the reference is
updated. If the value is reachable only through weak
references, it is dead, garbage collected, and weak
references pointing to it are invalidated.

{WeakReference.get WR ?Y} returns some(X) if the value
is still alive, and none if it has been garbage collected.