Functionalization as a way to enhance dispersion of carbon nanotubes in matrices: a review