(3) is implemented implicitly, based on insertion time, by having the key list in a FIFO (items are added at the end of the list, and the lookup for least_used_item starts from the beginning).
Implementing LRU is more tricky than it may look, at least in the current design. How do we define "used"? If used is "written", then we have no way to know at all. If used is "looked up for", then it's also hard, because modules like uip-ds6-neighbor, uip-ds6-route, or rpl-dag often do their lookup based on an IPv6 (not a rimeaddr) and therefore don't use the lookup functions of the neighbor_table module, but rather loop over the entries until they find a match.
I believe using insertion time is ok for now, because it comes only as a third criterion. We're not blindly removing the oldest neighbor constantly, but rather try to find the oldest among least used ones.