I resolved this by creating a script calling scanner.begin() which resets the modem and then using sms.flush to clear the sms buffer.
Somehow my sms buffer was completely full of txts (prob. because I forgot to use this command in my original code) and once full it would hang after receiving just one (even after adding this line back in), by running the above script for about an hour (receive, sms.flush, reset) it cleared out all the txts.
To get reliable in the field operation i've added a reset every 5 minutes or so for the modem which seems to be working fine.
I'm not sure why this is necessary (or if it would be, going forward), but it works for me.
There seems to be a few bugs in the GSM libraries based on my readings on the forum.
Anyone else have these issues? Anyone else resolve them a different way?