Peterson, Vikings hang on to beat Cardinals 21-14