Thread-safe lazy initialization in GenericGF

This pull request is an attempt to fix the following exception which is reported multiple times per day from an Android app that I work on:

```
Caused by: java.lang.IllegalArgumentException: Divide by 0
       at com.google.zxing.common.reedsolomon.GenericGFPoly.divide(SourceFile:205)
       at com.google.zxing.common.reedsolomon.ReedSolomonEncoder.encode(SourceFile:65)
       at com.google.zxing.qrcode.encoder.Encoder.generateECBytes(SourceFile:436)
       at com.google.zxing.qrcode.encoder.Encoder.interleaveWithECBytes(SourceFile:391)
       at com.google.zxing.qrcode.encoder.Encoder.encode(SourceFile:144)
       at com.google.zxing.qrcode.encoder.Encoder.encode(SourceFile:76)
...
```

The `initialized` field was not thread-safe which allowed multiple threads to call `initialize()`. This concurrent re-initialization would potentially allow mutations to be observed in `expTable` and `logTable` during encoding operations. Even if re-initialization did not occur, there is no guarantee that the initialization of these tables is visible on other threads because those initializing mutations occur outside of a synchronized context. Adding a double-checked lock and a nested holder class ensures that these shared resources are initialized once, are visible to all threads, and never change.

I spent a while reviewing the code and came to the conclusion that this is the only possible explanation for the exception. I am unable to reliably reproduce this exception so I haven't been able to verify that it addresses the root cause, however, I was able to generate corrupt `QRCode`s quite frequently. That problem should also be addressed by this fix.