Redesigned synchronization primitives for the userspace.

The kernel provides process-local semaphores that are inherited
to child-processes in a shared way. They don't survive exec's but
one can still use them for synchronization with non-exec'ed child-
processes. Mostly it is used within one process, of course.

Additionally, the kernel has global semaphores that are attached
to the filesystem. That is, one can synchronize on any file in
the tree by opening it and calling fsemup/fsemdown on that file-
descriptor. This does not affect reading, writing etc. of that
file. We just use the path of the file as the global name, in a
sense. This way, in many cases it will be simpler to come up
with a reasonable and unique name (which does already exist
hopefully). It is created on demand currently. It might be
imaginable to have an init-fcntl for it to assign the initial
value for the semaphore and have a fixed point of initialization.
Currently, we don't need it.

The userspace has an additional abstraction based on process-
local semaphores and atomic operations for the non-contention-
case.

The reader-writer-lock in the kernel has been removed entirely
and in general the synchronization stuff is a lot cleaner now.
We'll implement the reader-writer-lock in userspace in a similar
way as the usem* primitives.
Removed superfluous events.
We don't need the lastChild element in VFSNode.
Actually call clientRemoved in VFSChannel::invalidate.
Improved some prints.
Fixed error handling in VFSChannel::open.
Added assert.
Added a semaphore-pingpong test.
Added readers-writer-lock to libc.
Bugfix in pathtree: Don't use callback if data is NULL.
Bugfix in pathtree: path should start at last match.

Not the last existing node. So, e.g. if we have:
/ -> something
/foo -> NULL
/foo/bar -> something
Then a find of "/foo" should yield "foo", not "".
Fixed unittests for VFS-nodes.
mount: don't error out if the fs-driver exists, but use it.
Let itoa return the number of written chars, not the string.

The caller knows the string anyway.
Added a print-method to treap.
Bugfix: close the opened file in sharebuf.
Bugfix: unmap the sharedmem in fs on close.
virtmem: use a treap to store the shared files.

This way, we can find the file that we want to mmap much quicker.
virtmem: fixed error handling.
pagedir: we don't need to flush all PTEs when cloning.