With the missing piece from http://mathematica.stackexchange.com/questions/136188/how-do-i-read-out-the-vertex-names-on-this-graph/136192#136192 I can self-answer using [`Nearest`](http://reference.wolfram.com/language/ref/Nearest.html) and [`Graph`](http://reference.wolfram.com/language/ref/Graph.html).  Please don't let this post discourage answering as I am eager to see other approaches.

Now as a function with at least a little reusability.  The second parameter is the search radius. 

    order[data_, rad_: 0.0001] := Module[{dd, near, g},
      dd = Join @@ data;
      near = Nearest[dd -> Automatic, dd, {2, rad}];
      g = Graph[ Partition[Range @ Length @ dd, 2] ~Join~ Cases[near, {_, _}] ];
      FindPath[g, ##][[1]] & @@ GraphPeriphery[g]
    ]

    ListLinePlot[Part[Join @@ dat, order[dat]], Frame -> True]

[![enter image description here][3]][3]

It works on the set with gaps given a sufficient radius:

    ListLinePlot[Part[Join @@ dat2, order[dat2, 0.0001]], Frame -> True]

[![enter image description here][5]][5]


The next step in improving this would be to extract direction data from the output of `order` to apply to full lines.


  [1]: http://mathematica.stackexchange.com/users/590/halmir
  [2]: https://i.sstatic.net/2OXNs.png
  [3]: https://i.sstatic.net/9OoEc.png
  [4]: https://i.sstatic.net/8ST29.png
  [5]: https://i.sstatic.net/Ni3Xw.png