- Combined all parameters except the TextWriter into a single tuple since they'll always be passed together anyway.
- De-coupled the Compiler.precompile and Compiler.compile functions; now, 'precompile' is called separately and the result passed into 'compile', instead of 'compile' calling 'precompile'.
- Preparing to split PrecompilationState into two types, so the 'result' part of it can be passed directly into 'compile'.
- Replaced the PrecompilationState record with a type alias; now PrecompilationState is defined as ProcessedSpecification * ValidationMessages.