Go: new technic boosts performance of encoder by ~2.5 times

The reasons behind this patch are simple:
* Reflection is slow
* Reflection generates tons of garbage
* Let's get rid of reflection, but we can't
* Okay, let's not use it as much as possible

So, to avoid using reflection bunch of shortcut paths were created.
They all together cover vast majority of usecases.

I've benchmarked the code with ad-hoc script:
https://github.com/ikruglov/junk/blob/master/sereal-go/psrl.go
(be carefull, it dumps binary data to STDOUT)

results of old code:
sereal-go $ go run psrl.go -folder data/ > data_go.srl
<snip>
The call took 3.001318514s to run.

results of new code:
sereal-go $ go run psrl.go -folder data/ > data_go.srl
<snip>
The call took 1.28082218s to run.

with small modification [1], all tests pass:
sereal $ go test
PASS
ok      github.com/Sereal/Sereal/Go/sereal      0.085s

[1] for me it looks like current implementation has a bug,
    because in PerlCompat mode all arrays and hashes have to be references

diff --git a/Go/sereal/sereal_test.go b/Go/sereal/sereal_test.go
index 42913eb..881a6ae 100644
--- a/Go/sereal/sereal_test.go
+++ b/Go/sereal/sereal_test.go
@@ -82,7 +82,7 @@ func TestRoundtripCompat(t *testing.T) {

        input := []interface{}{map[string]interface{}{"foo": []interface{}{1, 2, 3}}}
        expectGo := []interface{}{map[string]interface{}{"foo": []interface{}{1, 2, 3}}}
-       expectPerlCompat := []interface{}{&map[string]interface{}{"foo": &[]interface{}{1, 2, 3}}}
+       expectPerlCompat := &[]interface{}{&map[string]interface{}{"foo": &[]interface{}{1, 2, 3}}}

        e := &Encoder{}
        d := &Decoder{}
Go: test bug fix
Go encoder: implement proper error checking
Go encoder: use recursion instead of double type casting

Profiling shows that type casting is quite expensive operation.
So it's faster to recurse in case of encode() receives reflect.Value.
Speed got improved by about 10%.
Go encoder: some code cleanup
Go encoder: encodeBytes() should dedup not only small strings
Go encoder: give a hint to encoder about expected output size

When ExpectedSize option is set, encoder simply preallocates buffer.
If the hint is correct, it adds upto another ~40% depedning on your dataset.

performance without ExpectedSize hint:
sereal-go $ go run psrl.go -folder data/ > data_go.srl
<snip>
The call took 1.28082218s to run.

performance with ExpectedSize hint:
sereal-go $ go run psrl.go -folder data/ -expsize 52428800 > data_go.srl
<snip>
The call took 708.295852ms to run.

I've benchmarked the code with ad-hoc script:
https://github.com/ikruglov/junk/blob/master/sereal-go/psrl.go
(be carefull, it dumps binary data to STDOUT)
Go encoder: fix borken PerlCompat mode

This solution doesn't allow the code to create ARRAYREF and HASHREF
tags. Will fix it later.
Merge pull request #62 from Sereal/kruglov/optimize_go_encoder

optimize Go's implementation of encoder