Fold system tray into observer process
The tray was a separate process with its own bus, polling loop, and
reconnection logic. Now it's an in-process component that shares the
observer's MessageBus and reads state directly. Pause/resume go through
Observer.pause()/resume() instead of D-Bus RPC. On headless systems the
tray silently skips. Removes solstone-tray entry point, install-tray CLI
command, and solstone-tray.desktop autostart file. Merges icon install
into install-service.