Previously AzuraCast had two very similar `$settings` variables, one that was from environment and the other from the database. This refactor distinguishes the two much more clearly.
- Move much of AzuraCast's merging and client integration into the library itself
- The library now uses typed properties on a return object for much more reliable hinting
- Update both this library and SupervisorPHP to use PSR-17 and PSR-18 standardized factories
- Switch to EntityManagerInterface for EM uses
- Wrap EntityManager in close-resilient wrapper
- Close/clear/reopen EM with every request
- Rework tests to be em->clear() resilient.
Implement an upgrade of the codebase to use Slim Framework version 4, which includes the following changes:
- Updating to Slim version 4 and the corresponding AzuraCore updates.
- Making all objects PSR-7 Request/Response agnostic (and creating RequestHelper and ResponseHelper objects to interact with the PSR-7 Req/Resp objects).
- Moving to PHP-DI as a DI container and implementing its autowiring support.
Rationale: under the current system, Supervisord simply pipes its per-process logs out to stdout/stderr on Docker, meaning it has no ability to read back those logs in the case of an error, leading to cryptic error messages like "SPAWN_ERROR" instead of the actual problem. This refactors the logging to be handled by Supervisord, which also is itself capable of log rotation (removing the need for AzuraCast to rotate radio software logs).