Added llvm bitcode optimizations to the main driver
Moved main driver into it's own module for easier unittesting of the whole process
Added driver unittest