We present a topology optimization approach for the design of fluid-to-fluid heat exchangers which rests on an explicit meshed discretization of the phases at stake, at every iteration of the optimization process. The considered physical situations involve a weak coupling between the Navier-Stokes equations for the velocity and the pressure in the fluid, and the convection-diffusion equation for the temperature field. The proposed framework combines several recent techniques from the field of shape and topology optimization, and notably a level-set based mesh evolution algorithm for tracking shapes and their deformations, an efficient optimization algorithm for constrained shape optimization problems, and a numerical method to handle a wide variety of geometric constraints such as thickness constraints and non-penetration constraints. Our strategy is applied to the optimization of various types of heat exchangers. At first, we consider a simplified 2D cross-flow model where the optimized boundary is the section of the hot fluid phase flowing in the transverse direction, which is naturally composed of multiple holes. A minimum thickness constraint is imposed on the cross-section so as to account for manufacturing and maximum pressure drop constraints. In a second part, we optimize the design of 2D and 3D heat exchangers composed of two types of fluid channels (hot and cold), which are separated by a solid body. A non-mixing constraint between the fluid components containing the hot and cold phases is enforced by prescribing a minimum distance between them. Numerical results are presented on a variety of test cases, demonstrating the efficiency of our approach in generating new, realistic, and unconventional heat exchanger designs.