The first pass only declares symbols and handles imports.
The second pass resolves variable types, base classes, evaluates static ifs/asserts etc.
A Scope class with added semantic information. (May be merged together with class Scope in the future.)
Creates an error report.
Common interface for semantic passes.