Added BZ2 compression

This resulted in quite a few modifications to the code, as follows:
    - Although this probably isn't an improvement at all, the program
    will now copy the entire file to memory first before working on it.
    This made writing the compression code easier and makes the code
    much simpler. I think I can justify doing this since it really
    doesn't make sense to use massive files with this application.
    - BZ2 compression is enabled by compiling with the USE_BZ2 constant
    defined. A simple -DUSE_BZ2 will do the trick. This has the same
    effect as compressing the file first and then using this application
    but I feel that this will be easier to use with a build system.
    People may have to change the compression level. Might make that an
    optional argument in a later version.
    - Cleaned up the code to do with reading and writing files. Will now
    use the FILE * pointer instead of file descriptors. It just feels
    neater.
    - Might be some other things I've forgotten to mention but this
    commit message is starting to feel longer then the changes I made.