Implement timed semaphores in the kernel, and add an appropriate syscall: TSEMACQUIRE. We wait for a semaphore for ms milliseconds or timeout otherwise. This is needed primarily for Go, since Go implements atomic sleeps in its runtime through timed semaphores. This change has been in use on Plan 9 for a while, by the Nix community.