There is a feature in Emacs 25.1 that does what I want, by allowing you to set priorities for the archives you specify. So you can say

 (setq package-archive-priorities
 '(("melpa-stable" . 20)
 ("marmalade" . 20)
 ("gnu" . 10)
 ("melpa" . 0)))

This will then install packages from the highest-priority archive they are available in. So with the above, `melpa` will only be used if a package can't be found in any of the other archives.