Use BufReader when reading bytecode from files

Using a 32KB buffer this allows us to drastically reduce the time spent
parsing bytecode files. Consider the following program:

    import std::ansi
    import std::ffi
    import std::fs
    import std::mirror
    import std::stdio::stderr
    import std::stdio::stdin
    import std::stdio::stdout
    import std::time

    stdout.print('hello world')

Prior to these changes, running this program (ignoring the compilation
itme) takes around 240 milliseconds. With these changes, this is reduced
to 20 milliseconds: a 12x improvement.
14 jobs for master in 19 minutes and 41 seconds (queued for 1 second)
Status Job ID Name Coverage
  Test
passed #139414472
lint:clippy

00:07:16

passed #139414473
lint:rustfmt

00:01:15

passed #139414474
lint:versions

00:00:41

passed #139414466
test:compiler:linux

00:02:23

passed #139414467
macos
test:compiler:macos

00:03:34

passed #139414468
test:ivm-nightly:linux

00:10:31

passed #139414470
macos
test:ivm-nightly:macos

00:07:19

passed #139414469
test:ivm-stable:linux

00:06:34

passed #139414471
macos
test:ivm-stable:macos

00:02:00

 
  Build
passed #139414475
build:ivm:linux

00:08:18

passed #139414476
macos
build:ivm:macos

00:05:38

 
  Test Runtime
passed #139414477
test:runtime:linux

00:00:52

passed #139414478
macos
test:runtime:macos

00:00:33

 
  External
passed continuous-integration/appveyor/branch