Assert on cyclic research dependencies instead of doing an infinite loop.

Spurious assertions are possible in the case that the research tree is excessively interconnected, such as
researches 31-40 all depending on all of researches 21-30, and researches 21-30 all depending on all researches
11-20, and so on. Although it probably shouldn't assert on excessively interconnected research trees, the loop as
written could take a ridiculously long time, anyway.
French translation update by Amiral JCDG.

Closes #3512.
Update translations.
Increase precision of sorting in generate-statistics-html.py.

Fix by Emdek, closes #3519.

Also remove unneeded "import os".
Fix some weird code that partly relied on sockets being blocking.

Exposed in 53ce0a7c38822feda52bc9ba24fd45d02a0fa7cc.
Don't use bsocket and tcp_socket at the same time.

Somehow fixes a client crash when failing to join a game. Possibly caused by deleting one of bsocket or tcp_socket,
and then using the other.
Don't continue to wait for a NET_ACCEPTED after processing a NET_REJECTED.

Don't wait for a NET_ACCEPTED after the socket is broken, either.
Fix host crash on failure in NET_CreatePlayer().

NET_CreatePlayer() should not be able to fail here, though. See following commit.

Crash was due to treating ERROR_FULL == 2 as an uint8_t pointer, and trying to dereference it.
Fix joining games with some closed slots.

Although it no longer crashed when trying to join a game with some closed slots (see previous commits), it is also
desirable to actually be able to join it.
Do not return client broadcast messages to the sender.

Instead of sending a copy of broadcast messages back to the sender, which ignores them anyway, save the bandwidth.
Don't send a value which is never read, anyway.
Simplify NETrecvGame() slightly.

No need to check for NET_* messages in game queues.
Don't desynch on dropped players.

Desynch was due to host-spoofed GAME_PLAYER_LEFT message being processed by clients at random times.

Instead of putting the GAME_PLAYER_LEFT in a NET_SHARE_GAME_QUEUE, put the GAME_PLAYER_LEFT in a NET_SHARE_GAME_QUEUE
in a NET_SEND_TO_PLAYER, such that the clients' NETrecvNet() will process the GAME_PLAYER_LEFT in the same iteration
of the for (current = 0; current < MAX_CONNECTED_PLAYERS; ++current) loop as the real GAME_* messages from that
player, and therefore not mix up the messages.

To reproduce before this commit, start 8-or-so clients, set all to debug mode, change game speed of some clients
slightly, start kicking players. Keep trying again, until desynch is reproduced. Changing game speed of some clients
might or might not be required.

See 93f0e61d924d6709c8db68b53d19f7e3bbeaa911.
Add a mac build for the image helper program.
Use a faster optipng option set that also strips metadata.

Requires optipng 0.7.1+ to work.
Allow queuing building on burning oil wells.

Actual construction only starts after the oil well finishes burning.
Add oil barrels to map preview.
Unduplicate backdrop pixel blitting code slightly.
Fix CB fire against mobile targets.

Steps to reproduce:
1) Player A builds a CB sensor.
2) Player B attacks the CB sensor with a mortar borg.
3) Player B runs away with the mortar borg where player A can't see.
4) Player A builds artillery.
5) Player B slowly kills off all the artillery with an MG viper wheels tank, while the artillery just sits there
   pointing at the mortar borg without firing.

To trigger, the artillery must be built after the last CB sensor in range of where the mortar borg attacks. Any
type of mobile artillery can trigger the bug, such as archangel leopard tracks, or MRA dragon wheels.

Workaround: Player A can build an uplink, so that the mortar borg becomes visible, and the artillery fires. If
            there's still anything left of the artillery by the time the uplink is built, that is.

Fixes ticket:3529.
Fix .gitignore.

The tools/image/image in .gitignore was mysteriously changed to be a directory only in
c346e9ebb6abafc9be31325ce3b2ce1c2f42227a, and the file therefore fails to be ignored.