Composite over mulitple time periods

// List of months
var months = ee.List.sequence(1, 12)
print("Months : ",months)

// List of years
var years = ee.List.sequence(2019, 2019)
print("Years : ",years)
var l8_monthly_mean = ee.ImageCollection.fromImages(
  years.map(function (y) {
        return months.map(function (m) {
                return l8_filter
                        .filter(ee.Filter.calendarRange(y, y, 'year'))
                        .filter(ee.Filter.calendarRange(m, m, 'month'))
                        .map(maskClouds)
                        .median()
                        .set('year',y)
                        .set('month',m);
            });
  })
  .flatten())
  .map(function(image){return image.clip(roi)})


print("Monthly mean : ",l8_monthly_mean)

Visualization

// Create RGB visualization images for use as animation frames.
var rgbVis = l8_monthly_mean.map(function(img) {
  return img.visualize(visParams);
})

// Define GIF visualization arguments.
var gifParams = {
  region: roi.geometry(),
  dimensions: 1000,
  crs: 'EPSG:3857',
  framesPerSecond: 1,
  format: 'gif'
}

// Print the GIF URL to the console.
print(rgbVis.getVideoThumbURL(gifParams))

// Render the GIF animation in the console.
print(ui.Thumbnail(rgbVis, gifParams))

Export an Image Collection

// Converts a collection to a single multi-band image containing all of the bands of every image in the collection.
var monthly_image = l8_monthly_mean.toBands()

// Get projection of the original image
var projection = l8_filter.first().projection().getInfo()

// Export the image, specifying the CRS, transform, and region.
Export.image.toDrive({
  image: monthly_image,
  description: 'L8_monthly_median_2019',
  folder: 'LBRAT2104',
  crs: projection.crs,
  crsTransform: projection.transform,
  region: roi
});