Fatal error (AssertionError on dev env) when a component instance's image references a deleted file
### Overview
A Canvas page that contains a component with an image prop fails to open in the editor when the referenced image file no longer exists. Instead of degrading gracefully (empty image, rest of the page still rendering), the whole editor preview fatals with an `AssertionError` and returns a 500. The log fills with repeated `assert(\is_string($url->value))` failures from `ComputedUrlWithQueryString`.
This happens whenever a component instance points at a deleted file/media — for example after a content reset, a partial re-import, or any workflow that removes a file an existing page still references.
The underlying cause is in how required prop expressions are evaluated. `ComputedUrlWithQueryString` computes the image URL via `Evaluator::evaluate(..., is_required: TRUE)`. The `is_required: TRUE` contract only throws when the evaluation *context* is `NULL` (no data at all). When the context exists — the image field item is present — but the *referenced* entity has been deleted, evaluation legitimately returns `NULL`. That `NULL` then flows straight into `assert(\is_string($url->value))`, which fatals when assertions are enabled (dev and CI). So a dangling image reference becomes an unhandled fatal rather than a recoverable empty render.
### Steps to reproduce
1. Create a Canvas page with a component that has an image prop (e.g. `card-with-remote-image`).
2. Note the file id the image input references (`src.target_id`).
3. Delete that file entity, leaving the page's reference dangling.
4. Open the page in the Canvas editor (`/canvas/editor/canvas_page/<id>`).
5. The editor fails to load; the log fills with `AssertionError: assert(\is_string($url->value))` at `ComputedUrlWithQueryString`.
### Proposed resolution
A deleted reference should not be able to fatal the editor. Two directions, to be decided:
- Handle a `NULL` resolved URL gracefully in `ComputedUrlWithQueryString` — render nothing / a placeholder for that image and let the rest of the page render.
- Or tighten the `Evaluator` `is_required` contract so a required expression that resolves to `NULL` (deleted/empty reference, not just a `NULL` context) is reported consistently to the caller, which then decides how to degrade.
Either way, the assertion must not be the mechanism that surfaces a missing image.
### User interface changes
None expected beyond the intended behavior: a component with a missing image renders without its image instead of breaking the whole editor.
issue