Instead of the crank's motion driving the body back and forth, I elected to keyframe the body's animation and synch that up with the crank's motion...
Position the crank with one of it's ends hinged at the rear wheel's crank-pin. Set it's Point of Origin at the pin's center.
Use the "Track to" constraint to always look at the front wheel nut.
Rotate the rear wheels 360 degrees over the desired frame range for speed of rotation.
Make sure the two keyframes are set to "Linear" interpolation.
(select keyframes in Dope sheet and press T)
Step the timeline cursor to the 2nd last frame and insert another rotation keyframe.
Delete the last rotation keyframe. This is to avoid a one-frame pause when at the next frame, we loop back to the first rotation frame again.
Play the animation and check that both keyframes are indeed linear. If unsure, check the graph editor. There should be a straight line (no curvature) in the transformation.
Set the view into Ortho Mode and from the side view and at frame 1, position the crank (in the Y axis only) over the front wheel nut as desired.
Add an object or mesh circle and center it at the front wheel nut's center. Make it a child of the crank.
Duplicate the marker and move it out in the X axis slightly, parent that to the Wheel nut.
These are going to be reference markers with which to keep the front wheel in the same relative horizontal position with respect to the crank. (i.e. keep both markers aligned in the Z axis by moving the body (boiler) in the Y axis only)
Step to frame 2, Drag the body (boiler) in the Y axis so both markers are aligned in the Z axis again.
Repeat this over the full number of frames you've got so far. (29 frames?)
Save the project under a different filename. (One_Rev.Blend?)
This will be a return reference point which you can always come back to.
In the Dope Sheet, duplicate all keyframes for the rear wheel's rotation and Body's animation and slide them to the right, one frame on from the final keyframe.
Check that out, make sure there's no jitter between each revolution.
Repeat the copy procedure, doubling the animation frames each time until you have sufficient.
Check it, make sure the crank isn't slopping around the front wheel nut. LCD screens may make it appear to be doing this but if you switch off the nut's visibility you will see that it's not.
If a slow down is required at the end, the Body's keyframes will need to be realigned for those slow-down frames.
The model is now ready to follow a path or be moved about manually or keyframed.
Save the project. This can be used for other projects that wish to use the loco.
Repeat Loop-backs for the extended animation would be a desirable alternative to the duplication process but in Vers 2.77a it appears you either have "cyclic" for a dopesheet strip, or you don't. There's no Bezier + Linear + Bezier again to start off slowly or slowdown at the end that I can see.