I was hitting this exception with `from * | limit 10` with the security rally track.

```
java.lang.IllegalArgumentException: Unknown writeable [org.elasticsearch.xpack.ql.type.EsField][InvalidMappedField]
	at org.elasticsearch.xpack.esql.io.stream.PlanNameRegistry.throwOnUnknownWritable(PlanNameRegistry.java:252) ~[?:?]
	at org.elasticsearch.xpack.esql.io.stream.PlanNameRegistry.getWriter(PlanNameRegistry.java:217) ~[?:?]
	at org.elasticsearch.xpack.esql.io.stream.PlanNameRegistry.getWriter(PlanNameRegistry.java:232) ~[?:?]
	at org.elasticsearch.xpack.esql.io.stream.PlanStreamOutput.writeNamed(PlanStreamOutput.java:76) ~[?:?]
	at org.elasticsearch.xpack.esql.io.stream.PlanNamedTypes.writeFieldAttribute(PlanNamedTypes.java:793) ~[?:?]
	at org.elasticsearch.xpack.esql.io.stream.PlanStreamOutput.writeNamed(PlanStreamOutput.java:78) ~[?:?]
	at org.elasticsearch.xpack.esql.io.stream.PlanStreamOutput.writeAttribute(PlanStreamOutput.java:61) ~[?:?]
	at org.elasticsearch.xpack.esql.io.stream.PlanNameRegistry$PlanWriter.write(PlanNameRegistry.java:46) ~[?:?]
	at org.elasticsearch.common.io.stream.StreamOutput.writeCollection(StreamOutput.java:1060) ~[elasticsearch-8.11.0-SNAPSHOT.jar:?]
	at org.elasticsearch.xpack.esql.io.stream.PlanNamedTypes.writeAttributes(PlanNamedTypes.java:764) ~[?:?]
	at org.elasticsearch.xpack.esql.io.stream.PlanNamedTypes.writeExchangeSinkExec(PlanNamedTypes.java:485) ~[?:?]
	at org.elasticsearch.xpack.esql.io.stream.PlanStreamOutput.writeNamed(PlanStreamOutput.java:78) ~[?:?]
	at org.elasticsearch.xpack.esql.io.stream.PlanStreamOutput.writePhysicalPlanNode(PlanStreamOutput.java:49) ~[?:?]
	at org.elasticsearch.xpack.esql.plugin.DataNodeRequest.writeTo(DataNodeRequest.java:72) ~[?:?]
```
x-pack/plugin/esql/src/test/java/org/elasticsearch/xpack/esql/io/stream/PlanNamedTypesTests.java
var plan = new RowExec(Source.EMPTY, List.of(new Alias(Source.EMPTY, "foo", field("field", DataTypes.LONG))));
        out.writePhysicalPlanNode(plan);
        bso.writeVInt(11_345);
        
        StreamInput in = ByteBufferStreamInput.wrap(BytesReference.toBytes(bso.bytes()));
        assertThat(in.readString(), equalTo("hello"));
        var planStreamInput = new PlanStreamInput(in, planNameRegistry, SerializationTestUtils.writableRegistry(), EsqlTestUtils.TEST_CFG);
        var deser = (RowExec) planStreamInput.readPhysicalPlanNode();
        EqualsHashCodeTestUtils.checkEqualsAndHashCode(plan, unused -> deser);
        assertThat(in.readVInt(), equalTo(11_345));
    }
    public void testUnsupportedAttributeSimple() throws IOException {
        var orig = new UnsupportedAttribute(
            Source.EMPTY,
            "foo",
            new UnsupportedEsField("foo", "keyword"),
            "field not supported",
            new NameId(53)
        );
        BytesStreamOutput bso = new BytesStreamOutput();
        PlanStreamOutput out = new PlanStreamOutput(bso, planNameRegistry);
        PlanNamedTypes.writeUnsupportedAttr(out, orig);
        var deser = PlanNamedTypes.readUnsupportedAttr(planStreamInput(bso));
        EqualsHashCodeTestUtils.checkEqualsAndHashCode(orig, unused -> deser);
        assertThat(deser.id(), equalTo(orig.id()));
    }
    public void testUnsupportedAttribute() {
        Stream.generate(PlanNamedTypesTests::randomUnsupportedAttribute)
            .limit(100)
            .forEach(PlanNamedTypesTests::assertNamedExpressionAndId);