Fix diff table in email for strange case when added==removed==empty
Localisation layer for Bugzilla, separated from templates

Languages are put into i18n/<lang>/ and consist of:
* messages.pl - messages for translating templates, substituted at compile time
* runtime.pl - messages that are needed in runtime, setup/strings.txt.pl is moved here
* messages.js - messages for JavaScripts

Templates aren't subdivided into languages anymore; the single
'template/localised' directory is used, and [% L('Message text') %]
or [% L('Message $1 text is $2', 'Param1', 'Param2') %] is used in
the templates. Both forms are substituted at template compile time.

Localised templates are auto-generated from English ones by the
contrib/extract-strings.pl script which also uses i18n/en/blacklist.pl
to determine what strings shouldn't be translated.

So, the commit includes:
* contrib/extract-strings.pl -- script for translating TT templates
* i18n/en/blacklist.pl -- blacklist of messages that should not be auto-extracted
* Template adjustments for more correct string extraction
  (for example, TT does not allow expressions in hash keys)
* Template adjustments for string extraction from JavaScript blocks
* js/*.js adjustments for using i18n messages
* Compile-time i18n message substitution implementation
* Bugzilla::Language class that manages loading of i18n messages