Fix Syscall.readlink() for non-ascii targets

Syscall.readlink() currently returns an integer indicating the number of
bytes in the link. As buf contains chars, this value is useless if the
target contains non-ascii characters (see #11778).

This commit deprecates the current overloads and creates a new overload
which uses a byte array instead of a StringBuilder.

There is also a new overload which does the retry-until-buffer-is-large-enough stuff and returns a string (or null on error). I've put this into Syscall because basically every caller needs this anyway. This overload uses UnixEncoding (the old code used whatever encoding was used for StringBuilder).

The same things were done for readlinkat().

This commit also cleans up callers of Syscall.readlink(), which fixes #9611.

Fixes #11778 and #9611