pub fn preprocess(raw: &[u8], path: &Path) -> Result<String, ParseError>
Stage 1: Preprocess raw bytes — decode UTF-8, strip BOM, normalize CRLF to LF.
Returns ParseError::IoError if the input is not valid UTF-8.
ParseError::IoError