Improve optimizations for boolean values

LLVM doesn't handle i1 value in allocas/memory very well and skips a number of optimizations if it hits it. So we have to do the same thing that Clang does, using i1 for SSA values, but storing i8 in memory.

Fixes #15203.
Ah. Maybe the builder needs a `load_ty` thing too? (e.g. it seems like `char` range asserts are missing here?)

(I kinda don't know what I'm talking about at all, so I should probably stop nitpicking...)