add copy and mutex to prevent slice to unmapped data

Using a slice to a direct pointer to C raises a problem of the mmaped data
being unmapped. Accessing this slice later would given invalid data.
To see the problem, take out the sync and copy and run jlog_read_test.go
demonstrate mmaped data fails and copy does not

See comments in file for exact process of when it'd fail.
move nil test til after error checked

same thing, just move the check. AKA use code that's there
instead of duplicating.
add concurrency test of multiple readers for a writer

The test fails. The readers each write everything they read to a file. The
md5sums of all the files should be the same. The expected behavior is that
all readers (since they start at the same place) should have the same data
read. This is not the case. When at least one writer has seen and written
everything, the others seem to stop. My guess is that they believe they
have seen the end of the file. They constantly fail on the
'return nil, nil' part of reader.go.
Why is life so hard?