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/main/java/org/elasticsearch/xpack/esql/io/stream/PlanNamedTypes.java
);
    }
    static void writeEnrichExec(PlanStreamOutput out, EnrichExec enrich) throws IOException {
        out.writePhysicalPlanNode(enrich.child());
        out.writeNamedExpression(enrich.matchField());
        out.writeString(enrich.policyName());
        out.writeString(enrich.policyMatchField());
        writeEsIndex(out, enrich.enrichIndex());
        writeNamedExpressions(out, enrich.enrichFields());
    }
    static ExchangeExec readExchangeExec(PlanStreamInput in) throws IOException {
        return new ExchangeExec(Source.EMPTY, readAttributes(in), in.readBoolean(), in.readPhysicalPlanNode());
    }
    static void writeExchangeExec(PlanStreamOutput out, ExchangeExec exchangeExec) throws IOException {
        writeAttributes(out, exchangeExec.output());
        out.writeBoolean(exchangeExec.isInBetweenAggs());
        out.writePhysicalPlanNode(exchangeExec.child());
    }
    static ExchangeSinkExec readExchangeSinkExec(PlanStreamInput in) throws IOException {
        return new ExchangeSinkExec(Source.EMPTY, readAttributes(in), in.readPhysicalPlanNode());
    }
    static void writeExchangeSinkExec(PlanStreamOutput out, ExchangeSinkExec exchangeSinkExec) throws IOException {
        writeAttributes(out, exchangeSinkExec.output());
        out.writePhysicalPlanNode(exchangeSinkExec.child());
    }
    static ExchangeSourceExec readExchangeSourceExec(PlanStreamInput in) throws IOException {
        return new ExchangeSourceExec(Source.EMPTY, readAttributes(in), in.readBoolean());
    }
    static void writeExchangeSourceExec(PlanStreamOutput out, ExchangeSourceExec exchangeSourceExec) throws IOException {
        writeAttributes(out, exchangeSourceExec.output());