Fix tray uptime and menu update churn
Add a dedicated _start_mono timestamp that is initialized once when the observer starts and use it for uptime reporting in the tray and D-Bus stats service instead of start_at_mono, which resets on each segment boundary.
Also guard every update_item() call in TrayApp._update_live_stats() behind label-change checks so unchanged live stats do not emit redundant D-Bus LayoutUpdated signals and cause the tray menu to blink every 5 seconds.
Update the tray and D-Bus tests to seed _start_mono on mock observers and add a regression test covering the no-op live stats update path.