Switch from system() to direct open() for xcoding

This has two primary benefits:
- We can control the transfer of data between the flac/lame processes.
  For example, to avoid each parallel task loading with both a lame and
  flac process simultaneously, we read the entire decoded flac into
  memory before providing any input to lame. This serializes their
  execution, this remaining inside the expected load from each
  transcoding process.
- We avoid a shell entirely, such that things like quotes are not
  interpreted and don't need to be escaped. (Previous method fails to
  transcode flac files with quotes in their names due to the shell.)