1) In the worst case, every point is within 5km of every other point, and you will end up creating (100 choose 3) triangles, and clever data structures won't speed this up. So you might be better off just doing the simple thing you have described.
2) Suppose you find, for each point, how for north of a reference point it is, and how far east of that reference point it is. Then think of a grid with one of its intersections at the reference point and with its lines just over 5km apart. Sort each point into the box in the grid that it lies in. Now iterate over the boxes in the grid, combining the points in them to make up triangles. Because the grid width is 5km you don't need to compare points from different grid boxes unless those grid boxes touch, at least at the corners. If they don't touch, those grid boxes are separated by at least 5km, and so are all of the points in them. (You could use some value slightly larger than 5km if you are worried about the curvature of the earth upsetting the implicit assumptions here)
Here are some notes and examples to explain (2) a bit more:
Examples of some of these ideas:
Pick the first point as the reference point. Suppose it is at 54.37N, 5.56W. By definition this is at (0, 0). Take a point at 54.32N, 5.703W. Ignoring the curvature of the earth, work out the distance from 54.37N, 5.56W to 54.32N, 5.56W to find out how far south the second point is from the first. Similarly find out how far west of the first point it is and give it a grid location of (-X, -Y) based on this. Do that for all points. Now use these grid locations to put the points into boxes, where each box holds all the points in a 5km x 5km grid square. You can do this just by dividing by five and then using floor() to turn this into an integer, which gives you a co-ordinate in a grid of boxes.
Iterate over all boxes. Suppose you are working on the box with its southwest point at (10, 15). You have to compare every point in that box with every other point in that box. You have to compare every point in that box with every point in the box with southwest point (10,20), because those two boxes lie alongside each other, so points on either side of the line joining them could be less than 5km apart. You even have to compare every point in the box with southwest point at (10, 15) with every point in the box with southwest point (15, 20) because you could have point (14, 19) in the first box and point (16, 21) in the second box and these are less than 5km apart. You DON'T have to compare any point in the box with southwest point (10, 15) with any point in the box with southwest point (20, 15) because the difference in north distances for these boxes means that every point in the (10, 15) box is more than 5km south of every point in the (20,15) box (if the way you put points into boxes is consistent even points exactly at grid locations won't go into two boxes this far apart unless they are MORE than 5km apart).
So the idea is that because you have sorted points into boxes and you only have to compare the points in a box with the points in the nine boxes that are its boxes and the boxes that neighbour its box, there are a lot of comparisons of points that you don't have to make. - But in the worst case every point ends up in the same box and you are sunk.