Optional .js & optional semicolons

Fixes part of #19.