Riemann Solvers and Numerical Methods for Fluid Dynamics: a Practical Introduction