Introduce a new PreprocessorError exception type.

This will be used to provide better preprocessor diagnostics.
Use the access protocol to instantiate records.
Better error reporting for duplicate preprocessor definitions.