mapdb: correct the mapdb_erase_special() convention

It hasn't even been used in anger but it's already had two bugs. Thankfully
this feature is small enough to be declared trivially correct after this.
*knocks wood*
space: add three range accessors, calls from mapdb.c

Those are space_clear_range(), space_set_range_access(), and
space_set_range(). They're all implemented in terms of space_modify_range(), a
static function.

This changeset also removes all direct calls to space_put_page() from
mapdb.c .
arch: add uniform page table access interface, i386 impl, use case

The use case is a postcondition for mapdb_add_map() that checks that the
affected page table entries are either not-present or set to the range of page
IDs given to the function.

arch_x86.c was added. Things that're namechecked in <ukernel/x86.h> should be
moved into it. Eventually it'll be renamed to conform to fresh new
directory-structure ideals, but until then a prefix is fine too.
add lazy filling of page tables, enforce it in mapdb & #PF handler

New functions:
  - x86_alloc_ptab() and pt_set_page(), former supporting the latter.
  - mapdb_fill_page_table(), low-level filling in of a map_group's worth of
    pages (i.e. a whole upper-level page) with pt_set_page().
  - space_prefill_upper(), space.c interface to mapdb_fill_page_table() to
    avoid exception.c making direct calls to mapdb (outside of asserts).

Other changes:
  - the #PF handler creates missing page tables lazily and fills them in
    eagerly.
  - ... so it can now enforce the "page tables need not be present, but when
    they are they must strictly reflect the mapping database's content" rule
    with asserts when NDEBUG isn't set.
  - the mapdb_add_map() inline postcondition was moved into
    add_map_postcond().
  - recognize a kernelspace fault whenever the user bit isn't set in the error
    indicator (and catch_pf_ok isn't set).
exception: do lazy fill of page tables under catch_pf()

If the lazy fill succeeds, the handler returns to the faulting instruction. A
re-fault will cause the same fill to fail, triggering longjmp(). The repair
path hasn't been tested at all, but since space_prefill_upper() is known to
always return false on the second go, it's fair to assume that this isn't
outright broken.

The immediate upshot is that copy_intraspace_stritem() no longer needs to
repair pagefaults, so no more calls to mapdb_probe(), space_put_page(), or
(perhaps most importantly) tail recursion.
derive PAGE_{SIZE,MASK} from PAGE_BITS

These should further come from a per-architecture header, but that'll wait.
replace space_put_page() in UTCB range access

With asserts against pt_page_present() (due to the page#0 issue) and
pt_get_pgid().
minor fixups in {acpi,exception,gdt}.c

In response to the Clang Static Analyzer. (that tool generates a whole pile of
false positives, so only the actually relevant hits were fixed here.)
space: fix a null-pointer niggle in sys_unmap()

This was exposed by the clang static analyzer. Despite this being in debug
code and thus seemingly unimportant, all code is supposed not to use pgid=0 as
a special value anyway, so in it goes.

The changeset also adds a note about how alloc_tss() is horrible and should be
fixed by using valloc() instead and relying on dlmalloc's ability to reuse the
leftovers smartly.