Future plans:
* Globals (requires a separate mmaped segment in JIT compiler)
* Pointers: pointer types, address-of operator (&), dereferencing, scope-based lifetime tracking in interpreter
* Function overloading: separate functions from values (again) in interpreter, allow casting to specific function type to take function value
* Const propagation: annotate expression AST nodes that are computable in compile-time
* Generic parameters: can be either values or `t : type`, but always compile-time
* Generic structs: `struct <t : type, n : u64> array:`, require explicitly specifying parameters when instantiated (used as a type or creating a value)
* Generic functions: `func <t : type, n : u64> max(a : t[n]):`, require explicitly specifying parameters when called or converted to function pointer
* Generic parameter inference for functions & structs
* Extension functions: operator overloading, destructors, iterators & for loop, move assignment (replaces built-in copy)
* Metaprogramming: assigning types to variables (of type `type`), functions can take `type` as regular arguments and return `type`, all type computations are compile-time only

Interpreter backlog:
* Fix identifier resolution for functions & variables
* C FFI (foreign functions)

Aarch64 compiler backlog:
* Structs
* Arrays

General backlog:
* Mutually recursive structs (relevant only with pointers)
* Empty array expression
* Calling functions as methods
