Issue #3607889: Key recursion protection on the render array cache keys
EntityViewBuilder::getRenderRecursionKey() fabricated a non-empty key from the entity id instead of using the render array's cache keys, as the change record for #2940605 (https://www.drupal.org/node/3316878) describes. Entities rendered in a non-cacheable context (empty #cache[keys]) therefore received a non-empty key and could be falsely detected as recursively rendered, blanking legitimate repeated/nested renders and logging "Recursive rendering attempt aborted".
Key on $build['#cache']['keys'] (plus the current Fiber id), return an empty string when there are none, and skip empty keys in the pre/post render callbacks. No render limit: repeated rendering stays unlimited and genuine recursion of a cacheable entity still re-enters with identical keys and is aborted.
Closes #3607889