Avoid using hard-coded MAC addresses and net_devices on TX path.

This introduces a reverse-path routing system based on the path a packet was received on.
We return it to the source MAC address on the device it arrived on; this seems to be a
reasonable heuristic to follow provided we have symmetric paths in the network.

[TODO] Integration with the Linux neighbour cache and routing framework, but doing so
       without using the socket interface was going to take more time than I currently
       have to get this working.