fix deadlock in neighbor expiration code
fix deadlock in neighbor expiration code

Summary:
Found a deadlock condition in the weekly push while canarying. The case was:

Update Thread:
Starts state update - grabs hwMutex
Neighbor entries changed - notifies NeighborUpdater
NeighborUpdater adds entries into NeighborExpirer's tsMap - grabs tsMutex

Background Thread:
timeoutExpired in NeighborUpdater
ArpExpirer runs refreshEntries - grabs tsMutex
While refreshing, SwSwitch->neighborEntryHit is called - grabs hwMutex

Which is a lock ordering issue that leads to deadlock. We should also clean up SwSwitch
to not provide locking for the hwSwitch implementations and instead expect them to
handle synchronization.

Test Plan:
Got the failure case we were seeing yesterday to repro by increasing the refresh
rate and adding a sleep call. Made this change and ran it overnight on a drained switch.

Reviewed By: petr@fb.com

Subscribers: net-systems@

FB internal diff: D1959287

Signature: t1:1959287:1427908857:97676e8ed5a232ede2e23ade5859683ee4c0c828

Signed-off-by: Ori Bernstein <f1fed15cf5b8387c8aee8bc535d6c2b48da91000@fb.com>

raphaelamorim/fboss,neuhausler/fboss,neuhausler/fboss,neuhausler/fboss,biddyweb/fboss,sonoble/fboss,peterlei/fboss,sonoble/fboss,biddyweb/fboss,peterlei/fboss,peterlei/fboss,peterlei/fboss,raphaelamorim/fboss,biddyweb/fboss,raphaelamorim/fboss,neuhausler/fboss,sonoble/fboss