Fix TimeZone.getTimeZone stack overflow in an edge case

The edge case requires a change in the system property
"persist.sys.timezone" to be "GMT-12:00". Normally, via
the Settings app, I can only set the value to be "Europe/London"
or "Etc/GMT-12", where the code path calling TimeZone.getCustomTimeZone
won't happen. The bug also happens only if the app's targetSdkVersion <=
29.

I reproduced the issue with a new test case
TimeZoneTest.testGetTimeZone_targetSdkVersion29.

LocaleData put all various locale data into the same class because
JNI cost was heavy to invoke ICU4C. LocaleData used to obtain all the
values from ICU4C in a single JNI call. However, it's no longer the
case, and all JNI calls are replaced by ICU4J calls or hidden away in
the @IntraCoreApi provided by the com.android.i18n module.

This splits the LocaleData into other classes
thus it reduces the chance of hitting the interdependency path
between libcore and ICU4J.

Performance: It may improve the performance of
certain code paths, but libcore.benchmark.FormatterTest doesn't
show any significant change in String.format performance.

A couple of TODO(http://b/217881004) are added because they are NOT a
regression introduced in this CL, but should be fixed in the future.

Bug: 205618822
Test: atest CtsLibcoreTestCases:libcore.java.util.TimeZoneTest
Change-Id: I1322af444285dbd66c0cab2a769bcc1bf10a33bc
17 files changed