Rearrange imports
work work
Fix slowdown

So it seems that "return" causes a real slow down for some reason. This
refactors code so that it avoids calling return (still there in one
location though) and thus achieves a great speedup compared to before.

Now doing 0.5Mpps at 70% CPU utilization. Passing all legitimate traffic
with no extra latency.
Put rule matching in own function
Move unblocking

We don't need to evaluate unblocking a source IP on every received
packet, even when in the slow path, so we move it to the periodic
function and check once for every IP every second.
More restructuring

.. to avoid the dreaded return. Now we are lots faster for when a packet
doesn't match any of our filters and should just be let through. Code
has been restructured so that it is easier to nest conditions and avoid
the return call.
Remove print
Add poc for slow return
mini poc
Fix bug and add stats
refactor so the code is readable
Improve ethernet / IP matching

Parse our ethertype and based on that get IPv4 or IPv6 source address.
Much better than the previous, very hackish, solution which would b0rk
on non-IPv4 packets.
Speed up packet matching

by reusing the datagram object. Any packets that aren't blocked should
now be handled much faster. Test machine does about 0.5Mpps, which is
something like 30-40% better than before.
Do rate-limiting for bps

We can now match bps in addition to pps.
Improve report rule output
Simplify report code
Further clarify report()
Update comments
Start of selftest
Run a fast selftest to check performance