feat: add DirectSessionParser for devices delivering complete sessions
Device payload (e.g. lasercutter/session):
{session_id, session_minutes, session_seconds, session_start_time, freetime_s, ip}
- parsers/direct_session_parser.py: new parser returning message_type='session_complete'
- parsers/registry.py: register 'direct_session' with freetime_s parameter (default 0)
- mqtt_device.py: add ('direct_session', 'Direct Session (Lasercutter)') to _PARSER_SELECTION
- tests/unit/test_direct_session_parser.py: 24 tests (happy-path, missing fields, defaults, registry)