socket-io: make it possible to specify an interface index as a MulticastInterface SocketOption on linux.

On windows, a value to IP_MULTICAST_IF with a most significant byte of zero is interpreted as an interface index instead of an ip address.
This makes it possible to set the interface index from .NET as follows:
socket.SetSocketOption(SocketOptionLevel.IP,
SocketOptionName.MulticastInterface, IPAddress.HostToNetworkOrder(ifindex));

For this to work on other platforms, we need to detect this case and handle it with an ip_mreqn struct.
socket-io: pass MulticastOption InterfaceIndex into ip_mreqn imr_ifindex
socket-io.c: merge #ifdef HAVE_STRUCT_IP_MREQN of network interface index and address

This commit and the related commits 11b2e351d887ef439ac377bc8137ba409965a8fb and af9fc5f16f4358d016d73a82684beacabadfe10c) are under the MIT license.
SocketTest: added tests for multicast index handling for MulticastOption class and MulticastInterface socket option

This commit is under the MIT license.
Merge pull request #815 from tmds/master

socket-io: interface index handling