start: load a basic initial GDT

Using this we also now set GS to a known segment pointing to known memory,
which means the stack check on entry to functions works as expected without
trashing the memory at physical address 0x30.
gdt: we now load a full, proper GDT in Rust.

The GDT loaded in start.S is used to get us into Rust code with a working
TLS segment for stack switching. The GDT loaded in Rust is then used for
everything else in the system.