Use alignment-sized integer for discriminant types

The previous behaviour of using the smallest type possible caused LLVM
to treat padding too conservatively, causing poor codegen. This commit
changes the behaviour to use an alignment-sized integer as the
discriminant. This keeps types the same size, but helps LLVM understand
the data structure a little better, resulting in better codegen.
I think this could be simplified a bit with:

```rust
for st in fields.iter() {
    let field = st.fields.iter().skip(1).filter(...).next();
    if let Some(field) = field {
        // ...
    }
}
```

Basically just avoiding the indentation with the outer `if` statement and using `skipe` instead of the first `.next()`