@ekajuan
Also I would put the origin points not in the center, but where you want to have the joint between the body-parts. then it rotates around that. Otherwise you rotation, and set the position at the same time, cause the rotation center is off. That might cause the delay too.
Like a chain, the joints are not in the middle, but at each end of the nods (or always the one in front in your case), thus causing the chain effect. Better to use that as rotation center, I am quite sure!
Still you can try that, no matter how you model movement itself. Even a snail consists of backbone-joints with this mechanics, def. better, you simulate that right.
As far as Pinning goes, I meant: You can also pin position only, and detect/calculate the angle for the right behavior. Of course rope style etc. is not what you need. A snake has muscles in each part of its body, producing rather sine-waves when moving, than pulling itself along, like paralyzed. Sure that's not gonna work
But you got that part right, I'm just saying, you could rework the joint-points, anyhow you solve positioning and angles.
And yes, you do round: abs(round(Snake.Angle-Snake.old_angle)) and round(Snake.Angle) in your file...