x86[_64]: Add support for CPUID sub-leaves

Some CPUID leaves may contain one or more sub-leaves accessed by setting
ECX to an appropriate value.
x86[_64]: Add CPU topology detection for Intel processors
x86[_64]: Do not return too soon from detectCPUTopology()
x86[_64]: Set level shift by counting bits in mask
x86[_64]: Add CPU topology detection for AMD processors
x86[_64]: Use uint32 for maximum CPUID leaf number
x86[_64]: Fix some style issues
kernel/util: Add bit hack utilities
x86[_64]: Add CPU cache topology detection for AMD and Intel CPUs
x86[_64]: Remove superfluous memset()s
kernel/util: Add bitmap implementation
x86[_64]: Fix style issues
kernel: Add O(1) lookup and insertion priority queue
kernel: Use the new runqueue in non-MP scheduler
kernel: Allow scheduler initialization to fail
kernel: Punish CPU bound threads

This patch appears to fix #8007.

Thread that consume its whole quantum has its priority reduced. The penalty
is cancelled when the thread voluntarily gives up CPU. Real-time threads
are not affected.

The problem of thread starvation is not solved completely. The worst case
latency is still unbounded (even in systems with bounded number of threads).
When a middle priority thread is constantly preempted by high priority
threads it would not earn the penalty, thus the lower priority threads
still can be starved. Moreover, the punishment is probably too aggressive
as it reduces priority of virtually all CPU bound threads to 1.
kernel: Do not require double parentheses in TRACE statements.
kernel: Update SchedulerTracing::EnqueueThread
kernel: Allow threads to always finish their time slice

Until now, when the thread has been preempted by higher priority
thread it was then placed at the end of its priority FIFO and given
a new time slice. This patch changes it allowing the thread to
complete its time slice (when the higher priority threads are done),
unless there was very little time left in which case this time is added
to the next time slice.

Apart from making the algorithm more fair this change allows to identify
CPU bound threads more easily. (Earlier they could 'hide' by being
preempted by higher priority thread and consequently never using
their whole time slice).
kernel: Use standard compliant version of variadic macros