new FileListing and cdnSync modules, plus tests
use FileListing.fromPath instead of stand-alone code