Move Along Mesh
Summary
The Move Along Mesh attaches instances to a mesh surface and animates them along the mesh based on its orientation. It works in two phases: first, attaches instances to the mesh based on proximity or random scattering; second, pushes instances along the mesh based on the orientation of the mesh.
The "up" vector of the chosen mesh acts as the "forward" vector for movement. This node works best in conjunction with the Orient Mesh node, which can easily generate these orientations for you along with options for swirling around the mesh, adding curl noise, and blurring the generated vectors for smoother motion.
If your instances start crowding each other you can try to enable Relaxation, but this can be tricky on surfaces with very high curvature.