This one escaped me.
Rather than using system views to generate permissions statements for all objects, you can use the grant statement WITHOUT the ON clause.
GRANT VIEW DEFINITION TO [user]
Rather than repeating this for each procedure >
GRANT VIEW DEFINITION ON sp_name TO [user]
Using it for the EXECUTE permission makes this piece of code redundant.