decode
Decodes the hearing table the server publishes for one recognizer build.
The document is {"build": ..., "version": ..., "words": {written: [allowance]}}, each allowance {"heard": ..., "after": ...} with after optional. A missing field, another shape or another type is refused, and so is a table published for another build. A field the table does not know is read past, at any depth, so that a field the server adds later does not stop a build already installed. A key repeated within one object keeps one of its values; which one is not promised and may differ between ports. The table is read as UTF-8, with or without a byte order mark.
This rests on a contract with the server: it may add a field, but never one that changes the meaning of a field read here, such as one that narrows an allowance, and it never renames or drops a field. An allowance whose after is misspelt is read as an allowance with no after, allowed after any word.