Review of output-based error estimation and mesh adaptation in computational fluid dynamics