Worker improvement

1.  Use a single web worker for all deflating/inflating tasks in a ZipReader/ZipWriter, instead of one worker for one entry. This significantly reduces the overhead of creating web workers when processing zip file with many entries. However, users now must call `close()` when they done with ZipReader/ZipWriter, or the worker is leaked.

2.  Separate codecs (Inflater/Deflater) and worker codes, and allow pluggable DEFLATE implementations. Now zip.js can work with zlib-asm and pako.

3. Avoid copy ArrayBuffer's between workers and main thread.

4. Move crc32 into worker, further reduce main thread's load.

Yeah, this is a useful pattern.
I think zip.js already use this pattern to some extend -- all functions and classes are enclosed in the `zip` module, however not every class has its own module.

Sometimes I also re-think about the "closure private" pattern: has it gone too far? In compiled class-based languages (Java, C#, C++), "private" doesn't imply runtime invisibility, you can access them by debugger or reflection. However "closure private" in JS are realy invisible at runtime, except that you happen to step into a inner scope of that closure in debugger. So "closure private" sometimes can hurt debugability of codes, especially for developers that are not familar with these codes. I think "private" in coding should means "I don't want other coders to depend on it", and should not means "I don't want other coders to investigate it". If so, some "closure private" can be avoided, and some naming patterns (e.g. "_" prefix) may be suficient to express "private".