I did some more testing with different mockup processes and I found a bug in how tokens are signalled, cancelled, and moved by the ProcessInstanceBean. Basically the action class holds a reference to the old instance of the managed bean that it uses for certain things, causing the part of the transaction to possibly be executed on an old jbpmContext, which would then fail.
I have reorganized some of that code to handle JbpmContexts more correctly, and I ported the token signalling to use this structure and the problem is now fixed. Tomorrow I will go through and update the remainder of the actions similarly, and go through another round of testing.
Ok, this stuff should all be taken care of. If anyone finds any problems with this code, please let me know asap. So far it's passing all of my tests.