fork: implemented with return_from_syscall

After context switching to the child, the child will call
return_from_syscall (the return address of __context_switch is
the address of return_from_syscall). This means the child returns
from fork immediately after context switching. This may need to be
changed later if the scheduler does some locking or something and
the child needs to unlock.

TODO:
        - fix set_esp0 (see FIXME in x86/syscall.c)
        - add preemption via timer