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).