Improve shootout-reverse-complement

Lots of unsafe code and lots of branches removed. Also multithreaded.

Rust old: 1.208 seconds
Rust new: 0.761 seconds
C: 0.632 seconds
There is no performance hit but only because the tables are so small.
```rust
fn gen_tables() -> Arc<Tables> {
    let mut t: Tables = unsafe { std::mem::uninitialized() };
 
    // ...
 
    Arc::new(t)
}
```
This first puts the table on the stack, then copies it to another place on the stack, and then copies it to the heap. I don't really want this kind of wasteful code in the benchmark.