Astrophysical N-Body Simulations: Algorithms and Challenges