Better CI v2.0: use Docker containers
We currently depend heavily on various proprietary YAML file build descriptions (i.e. Travis, CircleCI, GH Actions) to do our builds in [ci_targets](https://github.com/kaitai-io/ci_targets) repo.

It would be much better if the exact same thing will be possible to reproduce on a local machine, e.g. using lightweight virtualization like Docker containers. One of possible solutions will be:

1. Prepare Docker containers for all environments (realistically, *most*, not all, as we won't be able to do that on Windows and OS X), like `lua/5.3` or `python/2.7` or `cpp_stl_11/gcc4.8_linux`.

2. Ensure that we can run them locally in [tests](https://github.com/kaitai-io/kaitai_struct_tests) repo.

3. Build and publish them to some public Docker registry ([Docker Hub](https://hub.docker.com/), GitHub-provided Docker registry, etc)

4. Reduce CI build definition in [ci_targets](https://github.com/kaitai-io/ci_targets) to be something like

```yaml
jobs:
  test:
    steps:
      - name: Test
        uses: docker://ks-test-csharp-netcore3.0_linux:latest
      - name: Publish results
        uses: ... # invoke the same script for all languages
```

... instead of relying on on complicated preparation steps in files like [.travis.yml](https://github.com/kaitai-io/ci_targets/blob/master/.travis.yml) or [prepare-*](https://github.com/kaitai-io/ci_targets/blob/master/prepare-lua)

This kind of logic encapsulation in a contain will be possible at least using these CI engines:

* [GH Actions](https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idstepsuses)
* [CircleCI](https://circleci.com/docs/2.0/custom-images/#section=configuration)
* to certain extent, in [Travis](https://docs.travis-ci.com/user/docker/) — although it's more or less just using raw `docker ...` commands on a VM with this kind of virtualization enabled