RFR: Completely refactor agent heartbeat and agent <-> chassis mapping

A few things here:

* agent heartbeat contains hardware info
* agent model has a direct mapping to chassis, looked up by heartbeat hardware info
* agent IP is discovered by heartbeat request
* primary mac address is no longer primary key for the agent model
* new model `HardwareToChassis` maps multiple pieces of hardware info to a chassis