packet: expose original ethertype instead of packet.Type

Automatically converting the EtherType to packet.Type during unpack may cause
some loss of information (or worse) when an unknown ethertype is extracted.
packet: expose original IP protocol instead of packet.Type

Same as previous commit.
ping: check that the reply comes from the right host
ping: use random Id field
packet: add SLL encoder/decoder
packet: refactor IsPayload() and String() to avoid repeasting the switch cases
icmpv{4,6}: avoid infinite String() loop