[Link] Basic link implementation

- enqueue(): add packet to buffers
- transmit(): transmit packets according to their timestamps
- report(): reports flow_rate, buffer_occupancy, packet_drop
This is back to the issue of having space in the buffer for a new packet because one of the packets in the buffer is partially transmitted. Right now, the buffer is quantized by packets. Instead, we can record whether the link is currently transmitting and when it began doing so. By checking these values, you can factor in how much of the buffer is free because of a partially transmitted packet before dropping the incoming packet.