okay, I've made some progress! I went back to basics and tested v = visadev(name), write(v, 'curve?), readbinblock(v). I got data back!
I went back to my driver wrapper and ran it up to self.instr = visadev(name). Ran the write and read, and got data! The next line set the timeout, reran write and read and still got data!
Now here's the interesting part, the next block sets the terminator. Default on visadev is 'LF', and driver default is 'LF'. Running 'configureTerminator(self.instr, 'LF')', then running the read write produces the 101 read error code.
Now I need to snoop what's going on with 'configureTerminator'; reading works until you call that command, and calling it to change it to another character and back causes errors. The solution for the time being is just to not run that function.