Execution flow changed in order to allow further optimization

Summary:
- divided the main() in 8 parts and numbered them according to their order in the original code
- included an "optirun" makefile option in order to make it work on Nvidia Optimus laptops
- inserted part 6 between part 2 and 3, and part 7 between parts 3 and 5, to allow overlap between computation and data traffic
- moved part 1 (output) to the end of the MD loop to allow the overlap of IO and computing kernels
- error-handling if-statements were substituted by function calls
- Inserted if-clauses to prevent kernels (5, 6, 7, 8) from being enqueued when they are not necessary
- Moved the reductions of sys.epot and sys.ekin to part 1 (output)
- Added a placeholder to pinpoint the location of the barrier

A deeper explanation for each change can be found at
https://github.com/neumannrf/ljmd-opencl/commits/master