use forked ParseUint which doesn't require allocating a string

strconv.Parse[U]int requires a string argument.  Because we have a
byte slice, a conversion was required to provide a string (which
allocates a new piece of memory to store an immutable copy of our byte
slice).  This is somewhat silly - even though copying and pasting code
is 'bad', thousands of allocations are worse (6 allocations + memcpy
for each entry in each smaps file).
splitSpaces: check if byte == ' ' directly
procMem: don't track shared mem

We don't use this, and the comparision isn't free.
procMem: don't allocate a string just to check the type
splitSpaces: fix off by one error
splitSpaces: add benchmark
splitSpaces: shorter, more understandable algorithm (but slower?)
splitSpaces: reduce preallocation
splitSpaces: make i loop local [trivial]
splitSpaces: use bytes.IndexByte
Revert "splitSpaces: use bytes.IndexByte"

Using bytes.IndexByte didn't help performance (probably because the
lines we were searching through were so short).  Commiting this and
then immediately reverting, so that its in the history in case this
proves useful in the future.

This reverts commit 15fd4e9d5c542d3e5d1751fd6971f57c7c050f1a.
splitSpaces: call len(b) directly

removing the lenB temporary doesn't result in the benchmark running
slower (in fact the benchmark seems to improve by ~5%), and the code
looks cleaner without it, so switch to calling len(b) directly.