Updates to API: OpenAPI 3.1 + much refactoring
There are three main goals in this MR:
- Invert the dependency relationship between the Swagger/OpenAPI document and the API routing code so that the language-independent OpenAPI document is primary instead of being generated by the Ruby Grape API.
- Update from Swagger 2.0 to OpenAPI 3.1
- Refactor and simplify the API code itself. This has largely been driven by goal 1 insofar as we have used the OpenAPI standard as a means of dynamically generating as much of the Grape API code as possible, thereby removing a great deal of static code. Now all API parameter and route definitions are generated from the OpenAPI document leaving only the API operations to be statically defined.