How do you randomize within a Qualtrics form without breaking timing?
I've since completed this survey, so I thought that I would update with what I ended up doing. 

So, it turns out to not be possible to do randomization in an easy way when timing questions are involved, based on a review of online resources and talking to Qualtrics support. Timing questions simply don't support Qualtrics randomization, and there is not an advanced option to get around this. 

In the end, I used the following solution:

1 - I divided each of my questions into a separate block which consisted of the timing question, the multiple choice question, and a feedback display. 

2 - Instead of randomizing fully, I created 10 manual counterbalance conditions. I determined 10 different arrangements of my 8 questions that it seemed very unlikely that order effects would hurt my survey. For example, questions 1-8 in order, reverse order, and then shuffled randomly 8 additional times.  

3- In my case, with 8 questions to randomize,  I used the web services to randomly generate a number from 1-10, and then used a series of "if" statements which would trigger a conditional branch based on the random number, and then display the questions in a set order. 

For my use case this ended up being the best solution I could find. Manually and fully randomizing all blocks would have required 8! = 40,000+ different conditions. Even using a script to generate a .qsf file with this survey design would not work -- in my testing Qualtrics crashed whenever I tried to run a survey of this size. 

For those with fewer questions, programmatically creating a text file (either qsf or advanced text) may be a viable option. I found this link describing how to read qsf files in R and this explanation of import and exporting surveys helpful. 

(I'm going to accept this answer as I believe it's the most comprehensive response to my question possible, but if an editor disagrees and would prefer it remain open feel free to revert)