Enable 301 Redirects on about.gitlab.com for Marketing (infrastructure project)

moving the discussion from: https://gitlab.com/gitlab-com/www-gitlab-com/issues/3952 to infrastructure project

* [x] create a yaml file with redirects definitions: `www-gitlab-com/data/redirects.yml` , start with the following [content](https://ops.gitlab.net/gitlab-cookbooks/chef-repo/blob/master/roles/about-gitlab-com.json#L21) and use this format:
```
- sources: /some-old-path/ 
  target: /some-new-path/
- sources:
    - /another-old-path/
    - /another-old-path-as-well/
  target: /some-other-new-path/
```
* [x] add a CI job in the build stage that validates the yml file (@alejandro):
  * [x] no source path appears twice in the collection
  * [x] no target path appears twice in the collection
  * [x] no target path appears as a source path
  * [x] no redirect loops
* [x] create manually within Fastly (@mwasilewski\-gitlab):
  * [x] An edge dictionary named `redirects`
  * [x] link dictionary with a version of config
  * [x] create redirects with a condition which uses a table, follow [docs](https://docs.fastly.com/guides/performance-tuning/generating-http-redirects-at-the-edge) (the redirects are actually so simple that there shouldn't be a need for VCL snippets)
  * [x] update a 301 redirect using an API call
* [x] write a Ruby script `www-gitlab-com/bin/redirects` that will:
  * [x] read yml file, parse it into 3 parts: exact matches, simple regexes (literal matches), regexes
  * [x] exact matches (@alejandro):
    * [x] get items from fastly edge dictionary `curl -H "$FASTLY_API_TOKEN_STAGING" https://api.fastly.com/service/$FASTLY_SERVICE_ID_STAGING/dictionary/$FASTLY_DICTIONARY_ID_STAGING/items`
    * [x] compare with exact matches from yml:
      * [x] if items exist in fastly, but not in yml, delete them from fastly using batch update, e.g. json:

    ```json
        {
            "items": [
                {
                "op": "delete",
                "item_key": "/src/path1",
                "item_value": ""
                },
                {
                "op": "delete",
                "item_key": "/src/path2",
                "item_value": ""
                }
            ]
        }
    ```

  * [x] for all else use batch upsert api call, e.g. json:
  
    ```json
        {
            "items": [
                {
                "op": "upsert",
                "item_key": "/src/path1",
                "item_value": "/dst/path1"
                },
                {
                "op": "upsert",
                "item_key": "/src/path2",
                "item_value": "/dst/path2"
                }
            ]
        }
    ```

  * [x] literal matches and regexes:
    * [x] generate and upload one recv dynamic VCL snippet and one error dynamic VCL snippet. They need to include all rules inside of them. e.g. recv:
```
curl -X PUT -s https://api.fastly.com/service/$FASTLY_SERVICE_ID_STAGING/snippet/$FASTLY_VCL_SNIPPET_STAGING -H "$FASTLY_API_TOKEN_STAGING" -H 'Content-Type: application/x-www-form-urlencoded' --data $'content=if ( req.url ~ "^/gitlab-ee" ) {\n error 805 "Permanent Redirect";\n}\nif ( req.url ~ "^/development" ) {\n error 806 "Permanent Redirect";\n}\n';
```
e.g. error:
```
curl -X POST -s https://api.fastly.com/service/$FASTLY_SERVICE_ID_STAGING/version/8/snippet -H "$FASTLY_API_TOKEN_STAGING" -H 'Content-Type: application/x-www-form-urlencoded' --data $'content=if ( obj.status == 805 ) {\n set obj.status = 301;\n set obj.response = "Moved Permanently";\n set obj.http.Location = "/pricing/";\n synthetic {""};\n return (deliver);\n}\nif ( obj.status == 806 ) {\n set obj.status = 301;\n set obj.response = "Moved Permanently";\n set obj.http.Location = "/sales";\n synthetic {""};\n return (deliver);\n}\n';
```
* [x] add a protected env var with an API key to Fastly API tied only to the `about.gitlab.com` Fastly Service. An env var with a key was already present in `www-gitlab-com` ci/cd config. I turned it into a protected one and added a key for staging (@mwasilewski\-gitlab )
* [ ] add a CI job in the build stage that validates the script
* [x] add a CI job in the deploy stage that triggers the script
* [ ] after all this work is done, confirm redirects in Fastly are fully operational
* [ ] remove redirects from Chef and chef-repo

batch update curl: `curl -X PATCH -H 'Content-Type: application/json' -H "$FASTLY_API_TOKEN_STAGING" -d @batch.json "https://api.fastly.com/service/$FASTLY_SERVICE_ID_STAGING/dictionary/$FASTLY_DICTIONARY_ID_STAGING/items"`

[batch updating](https://docs.fastly.com/guides/edge-dictionaries/working-with-dictionary-items-using-the-api#batch-updating-dictionary-items) and [upserts](https://docs.fastly.com/guides/edge-dictionaries/working-with-dictionary-items-using-the-api#upserting-dictionary-items)

Story points: 5.0