nova: delegate exception portals on CPU of caller

Before this commit the exception portals for new threads has been mapped
during the reply from the pager of the new thread. The pager thread may
be located on another CPU as the caller thread - initiation the creation of the
new thread - is running on, so mapping will be denied by the kernel.

Instead map the exception portals on the CPU of the caller thread by calling
its pager and take the pager cap of the new thread as (translate) argument.
The pager code use the translated cap to lookup the pager_object of the new
thread. With that object in hand the pager can map the right exception portals
during the reply.

Issue #814
nova: catch exception when leaving thread::entry()

Catch exceptions and try to make a printf. If this also fails, catch
it and die causing some noise output in core to detect the situation.

Issue #814
base: avoid deadlock if invalid object is called

This avoids a deadlock if during issuing a printf the low level IPC fails.
. Printf uses an address space local lock and if we are trying again
to make a printf we deadlock forever ...

Issue #814
affinity test: print life signs by main thread

Issue #814
base: store initial ax and di registers in crt0.s

The values are used by a follow up commit by nova to get the boot CPU number.

Issue #814
nova: create core threads on boot cpu

The boot CPU is not necessarily 0 as currently assumed for base-nova.
Replace all hard coded values by the actual boot cpu number.

Issue #814