Can't loop through $form_state->setErrorByName?
I think you simply need to replace:

$form_state-&gt;setErrorByName($key, $this-&gt;t('cannot be empty.'));


with

$form_state-&gt;setErrorByName($key, $this-&gt;t('&lt;b&gt;%key&lt;/b&gt; cannot be empty.', ['%key' =&gt; $key]));


According to the docs, the first parameter will identify the field and the second will be the message to output. 

In your code, the $message string is outputed as expected, you need to prefix it with the $key parameter, the same way you do with drupal_set_message.