Add programmatic API

Detail are in the doc. 

@arikon @scf2k 
Хочется, чтобы, например, `gui`, всегда вел себя точно также, как и `cli`, включая дефолты. Чтобы при запуске  `gemini test` и `gemini-gui` был по сути один и тот же результат, просто полученный через разные интерфейсы. Если унести дефолты в cli, придется следить за их синхронизацией.