Use MessageCache to improve label lookup performance

Each single wfMessage call costs around 23ms (using Xdebug profiling) which means that when all properties are registered, wfMessage accounts for up-to 2/3 of the overall the processing/computing
(600ms+) time.

This PR introduces a simple MessageCache (wfMessage uses itself a MessageCache but still runs with 20-35ms per call) which allows to minimize the registration time to under 50ms (~0.5 per property).

As soon as the content language changes or the `json` file is being modified the cache becomes invalid.