We have a (now ancient) networking module that provides the basic serialization/deserialization functionality. Unfortunately module-networking2 (https://github.com/leapmotion/UnityModules/tree/module-networking2) never left the ground, so the code that actually sends and plays back the data is still very old.
The best we can do is point you to our VectorHand encoding and basically say the task to sync hand data is to implement a custom LeapProvider that receives hand data from the network and plays it back.
The only best practice is to keep hand data lightweight. The best method we have for good-looking but still lightweight compression is our VectorHand. Serialize two VectorHands into bytes, e.g. a little package of two of them for a mini "frame," send that over the network with a timestamp, receive it on the other end. You can interpolate the positions of the VectorHand to try to smooth out playback.
A custom LeapProvider -- checking out our new "PostProcessProvider" system is perhaps a good study on simple LeapProviders -- would be the way to play back hand data without having to synchronize hand bones manually. Hope this helps!