Allow source to be optionally passed to parse()

I was hacking around this and basically reimplementing `parse` when using this, which felt gross.  This lets you still get the goodies of the encoding and filetype detector while allowing you to not need to reparse a file.

Also this makes it much easier to test stuff if you don't need a real file.