Avoid second lookup in lock table

Use insert when creating a new (addr, lock) pair, so that we can get 
an iterator to the position. Then use the iterator to get the mutex.

Remove repeated calls to operator[]
Use unordered_map for storing locks

The locks are never iterated over, so unordered_map will end up being more efficient.
small edits
Merge branch 'patch-1' of https://github.com/n00btime/cppsynchronized

merging Jared's edits which replaced std::map with std::unordered_map
and removed the double operator[] on insertion