Support for Lua's I/O library
This can only open files in luafiles/ and its subfolders, and only a few file extensions are allowed.
The primary function for opening a file in read mode is
io.open(string filename, string filemode, function callback),
which is just like the one from vanilla Lua, except instead of returning a file handle,
the host first sends the file to every client, and then call the callback for everyone.
The callback is of the following form: function(file, filename).
Inside the callback, you can just use the regular I/O functions like base Lua.
The file is automatically closed after the callback returns.
Currently, only files on the server's side can be opened in a synced way, although I might decide to change that in a later patch.
For writing to a file, you can use the io.openlocal(filename, filemode) function,
which behaves exactly like io.open() from vanilla Lua (safe for the luafiles/ and whitelist restrictions).
Less importantly, io.openlocal() can be used for reading a file locally,
although this is only to be used in exceptional circumstances, such as reading a list
of passwords without sharing them with the clients, etc.
For extra safety, clients can only open files that are in luafiles/client/ and its subfolders.
...And of course io.popen is gone :V