Updated: Comment #1
The error methods for forms are bad. form_get_errors() uses global state and just returns the errors from the last submitted forms.
This needs cleaning up.
But first, we need better test coverage.
Add full test coverage and remove any weirdness that surfaces.
Explore possible solutions to removing the global-ness of form errors
User interface changes
file_save_upload() needs to be passed a $form_state. In all cases, it was already called from a form's context.
form_*_errors() need to be passed a $form_state. If it is not available, they can still see if there *were* errors by calling \Drupal::formBuilder()->getAnyErrors(), but that returns a Boolean only, not the errors themselves.