Add C extension for direct manipulation of memory

Sodium::Buffer should be able to implement tasks like direct string
modification and XOR quickly, without having to unwrap layers of Ruby
indirection.

Two functions, sodium_memxor and sodium_memput have been added to allow
for fast string XORs and fast string byte replacement (respectively).
Implement Sodium::Buffer[]= on top of Sodium::FFI::Memory#sodium_memput

Sodium::Buffer[]= will be incredibly useful to have for performant
buffer manipulation (by avoiding having to repeatedly allocate and
concatenate strings). It has been implemented on the new memput function
exposed through C.
Implement Sodium::Buffer#lpad, #rpad, #ljust, and #rjust

Padding and justification of an input string are useful when creating a
Sodium::Buffer. Performing this step at creation time is faster and
saves allocations versus creating a buffer and making a larger one with
the appropriate size later.
Implement Sodium::Buffer#[]=

This will allow for quick replacement of bytes inside the buffer,
without having to reallocate new buffers. We implement this logic
ourselves because the strings we operate on are frozen by the
interpreter (for instance, so they can't be resized).
Reimplement Sodium::Buffer#+ and #unpad on top of #[] and #[]=
Freeze Sodium::Buffer on instantiation

This is probably just a good idea in general. It also avoids having the
@bytes instance variable changed to point elsewhere, which would cause
bad mojo with our behind-the-scenes memory manipulation.
Revert "Use more specific specifiers for in/out buffers"

This reverts commit bfb87b16fc965bf94156dd463344c58083ea8b11.
Replace Sodium::Buffer#pad and #unpad with ::lpad and #ldrop

Also implement right-handed versions of these methods. They're now built
on top of the indexing methods recently implemented.
Added comment explaining #[]