Refactor Preprocessor, add Preprocessor::Str

A couple of things are broken and hang around as pending TODOs in the specs.