Design a Best Bid/Offer (BBO) tracker that maintains the current best bid, best ask, and spread.

Module name: bbo_track
Parameters:
  - PRICE_W = 24     // Price width (Q15.8 fixed-point)

Ports:
  - input  clk, rst_n
  - input  [PRICE_W-1:0] bid_price    // Incoming bid price
  - input  [PRICE_W-1:0] ask_price    // Incoming ask price
  - input                bid_valid     // Bid price is meaningful
  - input                ask_valid     // Ask price is meaningful
  - input                bid_update    // Latch new bid
  - input                ask_update    // Latch new ask
  - output [PRICE_W-1:0] best_bid     // Current best (highest) bid
  - output [PRICE_W-1:0] best_ask     // Current best (lowest) ask
  - output [PRICE_W-1:0] spread       // best_ask - best_bid
  - output               bbo_valid    // Both bid and ask have been set at least once

Functional specification:
  - Tracks the best (highest) bid and best (lowest) ask prices
  - spread = best_ask - best_bid (unsigned subtraction)
  - bbo_valid goes high once both bid and ask have been updated at least once
  - Updates only when corresponding _update signal is asserted
  - bid_valid / ask_valid indicate the incoming price is meaningful
  - On reset, bbo_valid is low and stored prices are zero
