extra::json: remove the use of `unsafe` char transmutes.

Avoid using -1 as a char sentinel, when Option<char> is the perfect
thing.
syntax: convert the lexer to use Option<char> over transmute(-1).

The transmute was unsound.

There are many instances of .unwrap_or('\x00') for "ignoring" EOF which
either do not make the situation worse than it was (well, actually make
it better, since it's easy to grep for places that don't handle EOF) or
can never ever be read.

Fixes #8971.
rustc: put range asserts on `char` loads.

A `char` is a Unicode codepoint, and so ranges from 0--0x10FFFF (with
the surrogate gaps): we may as well inform LLVM of this.
rustc: load bools as unsigned numbers.

Apparently loading them signed will break if/when they become i1.
auto merge of #12086 : huonw/rust/safe-json, r=kballard

The lexer and json were using `transmute(-1): char` as a sentinel value for EOF, which is invalid since `char` is strictly a unicode codepoint.

Fixing this allows for range asserts on chars since they always lie between 0 and 0x10FFFF.