log: differentiate between types of read/write

The logs will now report modified names of read, write, and ioctl functions
based on the type of file descriptor they are operating on. File descriptor
types are tracked on open/creation, and arguments to read/write/ioctl/fcntl
functions are correlated to those types.

Currently tracked:
    'F' : Regular file (generic FS access)
    'N' : Socket (network access)
    'P' : Pipe
    'D' : Device file (opened from /dev/*)
    'K' : Special kernel devices (opened from /proc/* or /sys/*)

Log entries will append the type of access to the name of the function. For
example, a write to a device file will look like:
    :0:400e2ec0:write_D:+0x90:libc.so(0x400c6000):

and a read from a network socket will look like:
    :0:4020ae00:read_N:+0x90:libc.so(0x401ee000):

The list of name-modified symbols is currently:
    read, readv, pread, pread64, write, writev, pwrite, pwrite64,
    ioctl, __ioctl, fcntl, __fcntl

Signed-off-by: Jeremy C. Andrus <jeremya@cs.columbia.edu>