Abstract ScalaJSOptimizer away from java.io.File.

Using an abstract view of a "file system" that has an abstract
type member for its representation of a file.

This is a part of fixing #350, so that, for example,
AbstractFiles can be used instead of java.io.File to support
virtual in-memory files.
Factor out invocation of Closure compiler for Scala.js.

Using the same file system-independent mechanism, so that
it will be usable with virtual files.