You sort of cheated me when you edited the code to make it correct. :)
I've thought about it a little, and I think the basic problem with your code is that you should be multiplying and dividing instead of adding and subtracting, since multiplication is the operation that represents composition in quaternions.
I am trying to think of the correct mathematical abstraction that would cover both the case of points in R^3 and the case of orientations, and I am not exactly sure (Differentiable manifolds with a notion of parallel transport? Lie groups?). My Geometry is too rusty.
In any case, the important thing is that at the very least you need the inertial part to work well: If no acceleration is applied, an object should rotate forever. In order to achieve that, you need to do
orientation *= orientation/old_orientation;
Then think of how to apply an angular acceleration to the result. It should be something like, after multiplying by dt*dt, expressing the rotation as a quaternion, and then multiplying that in.
You may want to renormalize the result after each update, to make sure that your quaternion's length remains 1 (otherwise it won't represent a rotation).