Function tokenizer::preprocess 3x faster

I added a bench to test the difference:

```rust
fn bench_preprocess(b: &mut test::Bencher) {
    let source = "Lorem\n\t\u{FFFD}ipusm\ndoror\u{FFFD}á\n";
    b.iter(|| {
        let _ = super::preprocess(source);
    });
}
```

With the old function, with 3 `replace()` (commit ea6c1b721):

    test tokenizer::bench_preprocess::bench_preprocess  ... bench:       440 ns/iter (+/- 24)

With the new function:

    test tokenizer::bench_preprocess::bench_preprocess  ... bench:       142 ns/iter (+/- 6)

I'm a newbie in Rust, so I guess that there are a lot of improvements to be done.
Please replace this loop with:
```rust
for byte in input.bytes() {
```
The iterator is optimized to skip the bound checks of `bytes[offset]`.