Understanding Molecular Simulation: From Algorithms to Applications