handle -invoke protocol fn specially, we want to drop the first arg
which is the fn itself. this is so that (-invoke identity 1) works
even without optimizations.