**Use case**

Generate models once and reuse them.

**Describe the solution you'd like**

Add command line options:
```
--save file - write serialized models on disk after training and before generating the data; the user can set --limit to 0 to only train the models and save them without proceeding to data generation;
--load file - instead of training the models, load the prepared models from the file and start generating the data.
```

Serialization format: one byte for version (equals to 0), then simple binary serialization of all the models; the whole file is compressed with ZSTD level 1 using CompressedWriteBuffer (no need to allow any compression options to choose).
{
private:
    using CodePoint = UInt32;
    using NGramHash = UInt32;
    struct Histogram
    {
        UInt64 total = 0;   
        UInt64 count_end = 0;
        using Buckets = boost::container::flat_map<CodePoint, UInt64>;
        Buckets buckets;
        void add(CodePoint code)
        {
            ++total;
            ++buckets[code];
        }
        void addEnd()
        {
            ++count_end;
        }
        CodePoint sample(UInt64 random, double end_multiplier) const