Cache
Replace the juggling with unordered_map and several lists with use of generalized cache data structure. Also, this one allows access from multiple threads concurrently (somewhat), which may prevent some lock contention and allow better scaling. In addition, it implements a limit on the number of active flows (which may need to become configurable in future).
Besides improving the handling of flow matching, this'll also be used for other caches (ARP, DNS, …) in the future.
It includes some more improvements and fixes around the place.
It should not be magical in regards to C++ syntax/tricks. However, I'd be glad if someone double-checks thread safety and correctness around all the pointer/iterator juggling.
Also, the target branch is selected so the correct commits are shown.