vfs: Fix lseek() boundary cases

The lseek() man page says this error cases:

    EINVAL whence is not valid.  Or: the resulting file offset would be
           negative, or beyond the end of a seekable device.

Fix lseek() to return a proper error instead of limiting the offset to
zero. For offsets beyond vnode size, let the underlying filesystem deal
with it.

This fixes a hang when reading "/proc/self/maps" via the OSv CRaSH
shell.

Reviewed-by: Nadav Har'El <nyh@cloudius-systems.com>
Signed-off-by: Pekka Enberg <penberg@cloudius-systems.com>
tests: Test case for lseek()

This adds a test case for lseek() to check for proper error code on
negative offsets.

Reviewed-by: Nadav Har'El <nyh@cloudius-systems.com>
Signed-off-by: Pekka Enberg <penberg@cloudius-systems.com>